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
#include<iostream>
#include<stdlib.h>
#include<string.h>
#include<stdio.h>
using namespace std;
int flag;
char f[][];
int visited[][];
int hang[]= {,-,-,-,,,,};
int lie[]= {-,-,,,,,-};
int n;
void dfs(int h,int l)
{
visited[h][l]=;
int i;
for(i=; i<=; i++)
{
int h1=h+hang[i];
int l1=l+lie[i];
if(h1>=&&h1<=&&l1>=&&l1<=n)
if(f[h1][l1]=='.'&&visited[h1][l1]==)
{
if(h==&&l==n)
{
flag=;
return ;
}
else
dfs(h1,l1);
}
}
visited[h][l]=;
}
int main()
{
int zong ;
cin>>zong;
while(zong--)
{
int i,j;
flag=;
memset(&f,'W',sizeof(f));
memset(&visited,,sizeof(visited));
cin>>n;
for(i=; i<=; i++)
{
for(j=; j<=n; j++)
cin>>f[i][j];
fflush(stdin);
}
dfs(,);
if(flag==)cout<<"YES"<<endl;
else cout<<"NO"<<endl;
}
return ;
}
本题应该注意的是八个方向的问题。