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 }
View Code

本题应该注意的是八个方向的问题。

你可能感兴趣的:(test)