您的位置:首页 > 其它

迷宫问题回溯算法

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 ;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: