test1.A[【dfs简单题】
Test1.A
Time Limit: 1000ms Memory limit: 65536K 有疑问?点这里^_^
题目描述
sdut 2274:http://acm.sdut.edu.cn/sdutoj/problem.php?action=showproblem&problemid=2274
给定一个2行n列的棋盘,从上到下行号为1..2,从左到右列号为1..n。有些格子可走,有些格子不可走。可走的格子用'.'表示,不可走的格子用'W'表示。现在路人甲想从格子(1,1)走到格子(1,n),问是否可以走到,如果可以,输出'YES',否则输出'NO'。(仅可以向相邻的且有公共点的可走格子移动)
输入
第一行包含一个整数T,表示测试数据的组数。
每组数据第一行仅包含一个整数n,表示有多少列。(n<=100)
每组数据第二到第三行每行包含n个字符,仅含.和W,表示棋盘。
数据保证第一列和最后一列的格子均为.。
输出
每组数据的输出占一行。
如果可以从(1,1)到(1,n),则输入YES,否则输出NO。
示例输入
1 3 .W. .W.
示例输出
NO
1 #include<iostream> 2 #include<stdlib.h> 3 #include<string.h> 4 #include<stdio.h> 5 using namespace std; 6 int flag; 7 char f[3][104]; 8 int visited[3][104]; 9 int hang[8]= {0,-1,-1,-1,0,1,1,1}; 10 int lie[8]= {-1,-1,0,1,1,1,0-1}; 11 int n; 12 void dfs(int h,int l) 13 { 14 visited[h][l]=1; 15 int i; 16 for(i=0; i<=7; i++) 17 { 18 int h1=h+hang[i]; 19 int l1=l+lie[i]; 20 if(h1>=1&&h1<=2&&l1>=1&&l1<=n) 21 if(f[h1][l1]=='.'&&visited[h1][l1]==0) 22 { 23 if(h==1&&l==n) 24 { 25 flag=1; 26 return ; 27 } 28 else 29 dfs(h1,l1); 30 } 31 } 32 visited[h][l]=0; 33 } 34 int main() 35 { 36 int zong ; 37 cin>>zong; 38 while(zong--) 39 { 40 int i,j; 41 flag=0; 42 memset(&f,'W',sizeof(f)); 43 memset(&visited,0,sizeof(visited)); 44 cin>>n; 45 for(i=1; i<=2; i++) 46 { 47 for(j=1; j<=n; j++) 48 cin>>f[i][j]; 49 fflush(stdin); 50 } 51 dfs(1,1); 52 if(flag==1)cout<<"YES"<<endl; 53 else cout<<"NO"<<endl; 54 } 55 return 0; 56 }
本题应该注意的是八个方向的问题。