Description
在N*N的迷宫内,“#”为墙,“.”为路,“s”为起点,“e”为终点,一共4个方向可以走。从左上角((0,0)“s”)位置处走到右下角((n-1,n-1)“e”)位置处,可以走通则输出YES,不可以走则输出NO。
Input
输入的第一行为一个整数m,表示迷宫的数量。
其后每个迷宫数据的第一行为一个整数n(n≤16),表示迷宫的边长,接下来的n行每行n个字符,字符之间没有空格分隔。
Output
输出有m行,每行对应的迷宫能走,则输出YES,否则输出NO
Sample Input
1 7 s...##. .#..... ....... ..#.... ..#...# ###...# ......e
Sample Output
YES
//
这是一道简单的搜索题,特别的基础。
使用深度优化搜索(dfs),用栈的话,代码比较长,用递归的则代码简洁。
///—递归实现—DFS(int step){ //step为当前状态—if(step==ans)—return ;—if(Next合法)—DFS (Step + 1)—(Step+1在这里表示Step的下一个状态)—}
代码如下:
#include<stdio.h> #include<string.h> int flag,n; int N[18][18]; char ch[18][18]; void dfs(int i,int j) { N[i][j]=1; if((i+1<n)&&(ch[i+1][j]=='.')&&(N[i+1][j]==0)) dfs(i+1,j); if((j-1>=0)&&(ch[i][j-1]=='.')&&(N[i][j-1]==0)) dfs(i,j-1); if((i-1>=0)&&(ch[i-1][j]=='.')&&(N[i-1][j]==0)) dfs(i-1,j); if((j+1<n)&&(ch[i][j+1]=='.')&&(N[i][j+1]==0)) dfs(i,j+1); if((j+1==n-1&&i==n-1)||(j==n-1&&i+1==n-1)) { flag=1; return; } } int main() { int m; scanf("%d",&m); while(m--) { memset(N,0,sizeof(N)); flag=0; scanf("%d",&n); for(int i=0;i<n;i++) scanf("%s",&ch[i]); dfs(0,0); if(flag) printf("YES\n"); else printf("NO\n"); } return 0; }
///
比较简洁的写法,对递归函数进行修改,
#include<stdio.h> #include<string.h> char P[16+3][16+3]; int B[16+3][16+3]; int m, n; void f(int x, int y) { if(P[x][y] != '.' || B[x][y]) return; B[x][y] = 1; f(x-1, y); f(x, y-1); f(x, y+1); f(x+1, y); } int main() { scanf("%d", &m); while(m--) { memset(P, '#', sizeof(P)); memset(B, 0, sizeof(B)); scanf("%d", &n); for(int i = 1; i <= n; ++i) scanf("%s", P[i]+1); P[1][1] = P[n][n] = '.'; f(1,1); printf("%s\n",B[n][n]==1 ? "YES" : "NO"); } return 0; }