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

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

posted @ 2013-09-21 19:07  狂盗一枝梅  阅读(343)  评论(0编辑  收藏  举报