迷宫问题回溯算法

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 ;


}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值