您的位置:首页 > 其它

走迷宫(回溯、深搜)判断能否到终点

2012-07-10 21:15 162 查看
时限:1000ms 内存限制:10000K 总时限:3000ms 描述:

判断是否能从迷宫的入口到达出口

输入: 先输入两个整数表示迷宫的行数m和列数n,再输入口和出口的坐标,最后分m行输入迷宫,其中1表示墙,0表示空格每个数字之间都有空格。

输出: 若能到达,则输出"Yes",否则输出"No",结果占一行。

输入样例:

3 3
0 0
2 2
0 0 0
1 1 0
0 1 0

输出样例:

Yes

输入样例:

12 12
1 8
10 7
1 1 1 1 1 1 1 1 1 1 1 1
1 0 0 0 0 0 0 1 0 1 1 1
1 0 1 0 1 1 0 0 0 0 0 1
1 0 1 0 1 1 0 1 1 1 0 1
1 0 1 0 0 0 0 0 1 0 0 1
1 0 1 1 1 1 1 1 1 1 1 1
1 0 0 0 1 0 1 0 0 0 0 1
1 0 1 1 1 0 0 0 1 1 1 1
1 0 0 0 0 0 1 0 0 0 0 1
1 1 1 0 1 1 1 1 0 1 0 1
1 1 1 1 1 1 1 0 0 1 1 1
1 1 1 1 1 1 1 1 1 1 1 1

输出样例:

Yes

#include<stdio.h>
int Arr[30][30];//最大迷宫为30*30
int Rownum=0,Colnum=0;//行列数
int Beginrow,Begincol,Endrow,Endcol;//终点坐标
int state=0;//迷宫走通与否状态
int canplace(int row,int col)//判断当前点能否走通
{
if(row>=0 &&col>=0 &&row<Rownum &&col<Colnum &&Arr[row][col]==0)//为越界且可走通
return 1;
return 0;
}
void search(int row,int col)
{
if(row==Endrow && col==Endcol)//是目标终点
{    state=1;  return ;   }

int r,c;
Arr[row][col]=1;//对可走通的点进行标记
r=row-1; c=col; //上
if(canplace(r,c))  search(r,c);
r=row; c=col+1;//右
if(canplace(r,c))  search(r,c);
r=row+1;  c=col;//下
if(canplace(r,c))  search(r,c);
r=row;    c=col-1;//左
if(canplace(r,c))  search(r,c);
}
int main()
{
int i,j;
scanf("%d%d",&Rownum,&Colnum);//输入迷宫行列数
scanf("%d%d%d%d",&Beginrow,&Begincol,&Endrow,&Endcol);//起始点,终点坐标
for(i=0;i<Rownum;i++)
for(j=0;j<Colnum;j++)
scanf("%d",&Arr[i][j]);       //一行一行的输入迷宫布局

Arr[Beginrow][Begincol]=1;
search(Beginrow,Begincol);
//一个迷宫搜索路径后的最终状态,起始点接通与否
if(state==1)
printf("Yes\n");
else
printf("No\n");
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: