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

时限: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;
}

 

posted on 2012-07-10 21:15  IThinktan  阅读(721)  评论(0编辑  收藏  举报

导航