迷宫问题回溯算法
2014-03-22 16:46
302 查看
9 9
1 1 6 8
0 0 1 0 0 0 1 0 1
0 0 1 0 0 0 1 0 0
0 0 0 0 1 1 0 1 1
0 1 1 1 0 0 0 0 1
0 0 0 1 0 0 1 0 0
0 0 0 0 0 1 0 1 0
0 1 1 1 1 0 0 1 0
1 1 0 0 0 1 0 1 1
1 1 0 0 0 0 0 0 0
#include<stdlib.h>
#include<stdio.h>
#include<string.h>
int move[4][2]={{-1,0},{0,1},{1,0},{0,-1}};
int map[20][20];
int visited[20][20];
//int endx,endy;
int m,n;
//m表示x,n表示yd
struct point{
int x;
int y;
}path[30];
int dfs(int x,int y,int endx,int endy,int &count){
//cout<<x<<y<<endl;
if(endx==x&&endy==y){
path[count].x=x;
path[count].y=y;
return 1;
}
int tempx,tempy;
if(map[x][y]==0&&visited[x][y]==0){
//visited==0表示没有访问过
path[count].x=x;
path[count].y=y;
count++;
visited[x][y]=1;
int flag=0;
for(int i=0;i<4;i++){
tempx=x+move[i][0];
tempy=y+move[i][1];
if(tempx>=0&&tempx<m&&tempy>=0&&tempy<n&&map[tempx][tempy]==0&&visited[tempx][tempy]==0){
//visited[tempx][tempy]=1;//多打了一个等于号就
flag=dfs(tempx,tempy,endx,endy,count);//走不下去才需要回溯
visited[tempx][tempy]=0;
if(flag==1)
return 1;
}
//}
}
}
count--;
return 0;
}
void main(){
scanf("%d%d",&m,&n);
memset(map,1,sizeof(map));
memset(visited,0,sizeof(visited));
int start_x,start_y;
int endx,endy;
int count=0;
scanf("%d%d%d%d",&start_x,&start_y,&endx,&endy);
for(int i=0;i<m;i++)
for(int j=0;j<n;j++){
scanf("%d",&map[i][j]);
}
if(dfs(start_x,start_y,endx,endy,count)==1){
printf("可以到达\n");
for(int i=0;i<=count;i++){
printf("%d%d ",path[i].x,path[i].y);
}
}
else
printf("no\n");
getchar();
getchar();
return ;
}
1 1 6 8
0 0 1 0 0 0 1 0 1
0 0 1 0 0 0 1 0 0
0 0 0 0 1 1 0 1 1
0 1 1 1 0 0 0 0 1
0 0 0 1 0 0 1 0 0
0 0 0 0 0 1 0 1 0
0 1 1 1 1 0 0 1 0
1 1 0 0 0 1 0 1 1
1 1 0 0 0 0 0 0 0
#include<stdlib.h>
#include<stdio.h>
#include<string.h>
int move[4][2]={{-1,0},{0,1},{1,0},{0,-1}};
int map[20][20];
int visited[20][20];
//int endx,endy;
int m,n;
//m表示x,n表示yd
struct point{
int x;
int y;
}path[30];
int dfs(int x,int y,int endx,int endy,int &count){
//cout<<x<<y<<endl;
if(endx==x&&endy==y){
path[count].x=x;
path[count].y=y;
return 1;
}
int tempx,tempy;
if(map[x][y]==0&&visited[x][y]==0){
//visited==0表示没有访问过
path[count].x=x;
path[count].y=y;
count++;
visited[x][y]=1;
int flag=0;
for(int i=0;i<4;i++){
tempx=x+move[i][0];
tempy=y+move[i][1];
if(tempx>=0&&tempx<m&&tempy>=0&&tempy<n&&map[tempx][tempy]==0&&visited[tempx][tempy]==0){
//visited[tempx][tempy]=1;//多打了一个等于号就
flag=dfs(tempx,tempy,endx,endy,count);//走不下去才需要回溯
visited[tempx][tempy]=0;
if(flag==1)
return 1;
}
//}
}
}
count--;
return 0;
}
void main(){
scanf("%d%d",&m,&n);
memset(map,1,sizeof(map));
memset(visited,0,sizeof(visited));
int start_x,start_y;
int endx,endy;
int count=0;
scanf("%d%d%d%d",&start_x,&start_y,&endx,&endy);
for(int i=0;i<m;i++)
for(int j=0;j<n;j++){
scanf("%d",&map[i][j]);
}
if(dfs(start_x,start_y,endx,endy,count)==1){
printf("可以到达\n");
for(int i=0;i<=count;i++){
printf("%d%d ",path[i].x,path[i].y);
}
}
else
printf("no\n");
getchar();
getchar();
return ;
}
相关文章推荐
- 数据结构与算法学习之路:迷宫问题——回溯思想找出所有路径
- C语言链栈以及回溯算法解决迷宫问题
- 回溯算法经典应用之—迷宫问题 (Java)
- 回溯算法基础---皇后问题,骑士游历,迷宫求解
- 回溯算法之迷宫问题
- 算法[回溯]-八皇后问题
- 回溯法的典型问题 八皇后 马踏棋盘 迷宫
- 第一篇:算法之使用递归求解迷宫问题
- 全面解析回溯法:算法框架与问题求解
- 〖編程·C++〗回溯算法:排列树 - 工作分配问题
- 国际象棋“皇后”问题的回溯算法
- 迷宫问题--非递归回溯 C语言实现
- 图的点着色、区间着色问题及其应用(基于贪心思想的DFS回溯法求点着色问题和区间着色算法求解任务调度问题)
- 算法之迷宫问题
- 回溯算法解数独问题(java版)
- 回溯算法—N皇后问题
- 蓝桥杯 算法提高 学霸的迷宫 经典BFS问题
- 迷宫问题二 统计路径条数(dfs+回溯)
- C++搜索与回溯算法之全排列问题
- 迷宫问题----搜索算法(回溯)