迷宫寻路 NEFUOJ 558

林大OJ测评

description

AC小公主很喜欢设计迷宫,她设计的迷宫只有两个口,一个入口,一个出口。但小公主有时候很调皮,她会让挑战者走不出迷宫。现在给你AC小公主的迷宫请你判断挑战者能否成功从出口走出迷宫,迷宫包证边界为障碍物,只有两个不同的入口。
“#”代表障碍物,“*”代表可走的路。

							

input

输入有多组,每组输入两个正整数n,m( 2 < n < m < 1000)。
接下来n行,每行有m个字符。


							

output

每组测试实例,若挑战者能走出迷宫输出”YES”,否则输出“NO”。
							

sample_input

3 3
#*#
#*#
#*#
3 3
#*#
###
#*#


							

sample_output

YES
NO
这个题是我接触搜索类题目的第二个,下面分享下我的一点思路,供各位初学的同僚们分享,大神们可以忽略……
     题目称就有两个出口,那我就从四条边开始搜遇到“*”就以它为起点进行搜索将所有遍历的“*”都变成“@”,最后在四条边上若能找到两个“@”说明挑战者能出去,若只有一个就不能出去。   特别注意:遇到“*”就搜索,但只能搜一次。
     我说的挺乱的,看看代码吧,帮助理解,呵呵……
    
#include <cstdio>
#include <iostream>
#include <string.h>
using namespace std;
int xx[]= {1,0,0,-1};
int yy[]= {0,1,-1,0};
char a[100][100];
int n,m;
void sou(int x,int y)
{
    int i;
    a[x][y]='@';
    for(i=0; i<4; i++)
    {
        if(x+xx[i]>=0&&x+xx[i]<n&&y+yy[i]>=0&&y+yy[i]<m&&a[x+xx[i]][y+yy[i]]=='*')
            sou(x+xx[i],y+yy[i]);
    }
}
int main ()
{
    int count,i,j,x,y,t;
    while(~scanf("%d%d%*c",&n,&m))
    {
        for(i=0; i<n; i++)
        {
            for(j=0; j<m; j++)
                scanf("%c",&a[i][j]);
            getchar();
        }
        t=1;
        for(i=0; i<m; i++)
        {
            if(a[0][i]=='*')
            {
                x=0;
                y=i;
                sou(x,y);
                t=0;
                break;
            }
            if(a[n-1][i]=='*')
            {
                x=n-1;
                y=i;
                sou(x,y);
                t=0;
                break;
            }
        }
        if(t)
            for(i=1; i<n-1; i++)
            {
                if(a[i][0]=='*')
                {
                    x=i;
                    y=0;
                    sou(x,y);
                    break;
                }
                if(a[i][m-1]=='*')
                {
                    x=i;
                    y=m-1;
                    sou(x,y);
                    break;
                }
            }
        count=0;
        for(i=0; i<m; i++)
        {
            if(a[0][i]=='@')
               count++;
            if(a[n-1][i]=='@')
                count++;
        }
        for(i=1; i<n-1; i++)
        {
            if(a[i][0]=='@')
               count++;
            if(a[i][m-1]=='@')
                count++;
        }
        if(count==2)
            printf("YES\n");
        else
            printf("NO\n");
    }
    return 0;
}


你可能感兴趣的:(迷宫寻路 NEFUOJ 558)