1. 程式人生 > >zcmu-1185: 走迷宮(dfs經典題)

zcmu-1185: 走迷宮(dfs經典題)

1185: 走迷宮

Time Limit: 1 Sec  Memory Limit: 128 MB
Submit: 379  Solved: 153
[Submit][Status][Web Board]

Description

給一張個迷宮,問能否從起點走到終點,只能往上下左右走,不能斜著走

Input

多組測試資料,每組第一行兩個正整數,分別為n和m

表示n這個迷宮有n行m列(0<n,m<10)

接著是n行m列,

'#'表示路

‘*’表示牆

‘S’表示起點

‘T’表示終點

Output

每組測試資料輸出一個結果,如果能從S走到T,輸出“YES”,否則輸出“NO”

Sample Input

2 2 S* #T 3 3 S*# #*T ##*

Sample Output

YES NO

 

 n,m邊界那裡糾結了很久,還去問了同學,其實畫一下就好了哈哈哈笨呆了

#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <cstdlib>
#include <map>
#include <list>
#include <vector>
#include <stack>
#include <queue>
#include <algorithm>
#include <iostream>
#define mem(a) memset(a,0,sizeof(a))
using namespace std;
typedef long long ll;
char c[15][15];
int flag = 0,n,m;
//往上、下、左、右走的時候x,y座標的變化
int dx[] = {0,0,-1,1};
int dy[] = {-1,1,0,0};
int vis[15][15];
void dfs(int x,int y)
{
    vis[x][y] = 1;
    if(c[x][y] == 'T')//搜到了就停了
    {
        flag = 1;
        return;
    }
    for(int i = 0; i < 4;i++)//沒搜到,就繼續往四個方向搜
    {
        int x1 = x + dx[i];
        int y1 = y + dy[i];
        if(x1 >= 0 && y1 >= 0 && x1 < m && y1 < n && !vis[x1][y1] && c[x1][y1] != '*')//這裡不能寫 == ‘#’,我剛開始寫錯了,而且把x1,y1的範圍nn,m弄反了
            dfs(x1,y1);
    }
}

int main()
{
    while(scanf("%d%d",&n,&m) != EOF)
    {
        int sx,sy;
        flag = 0;
        mem(vis);
        for(int i = 0;i < n;i ++)
        {
            getchar();//別忘記這個
            scanf("%s",c[i]);
        }
        for(int i = 0;i < n;i++)
        {
            for(int j = 0;j <m;j++)
            {
                if(c[i][j] == 'S')
                {
                    sx = i;
                    sy = j;
                    break;
                    
                }
            }
        }
        dfs(sx,sy);
        printf(flag ? "YES\n":"NO\n");
    }
    return 0;
}