Seeding
Time Limit : 2000/1000ms (Java/Other) Memory Limit : 65536/32768K (Java/Other)
Total Submission(s) : 70 Accepted Submission(s) : 29
Tom wants to seed all the squares that do not contain stones. Is it possible?
Input
The first line of each test case contains two integers n and m that denote the size of the field. (1 < n, m < 7) The next n lines give the field, each of which contains m characters. 'S' is a square with stones, and '.' is a square without stones.
Input is terminated with two 0's. This case is not to be processed.
Output
For each test case, print "YES" if Tom can make it, or "NO" otherwise.
Sample Input
4 4
.S..
.S..
....
....
4 4
....
...S
....
...S
0 0
Sample Output
YES
NO
这道题刚开始做也是觉得很简单,觉得遍历一遍不就行了?!但是最后连样例都过不了,
然后开始重新看题,发现并不是那么简单,要尽可能的找到能全部耕完地的方案。
ac代码:
#include<stdio.h>
#include<string.h>
#include<iostream>
#include<algorithm>
#define MAXN 110
using namespace std;
char map[MAXN][MAXN];
int dir[4][2]={{1,0},{-1,0},{0,1},{0,-1}};
int n,m,num,bz;
int v[MAXN][MAXN];
int check(int xx,int yy)
{
if(xx<0||xx>=n||yy<0||yy>=m||map[xx][yy]=='S')
return 1;
if(v[xx][yy])
return 1;
return 0;
}
void dfs(int x,int y,int sum)
{
if(check(x,y)||bz)
{
return;
}
if(sum==0)//要把地全都耕完才符合方案
{
bz=1;
return;
}
v[x][y]=1;//这个开始搞了很久
for(int i=0;i<4;i++)
{
int nx=x+dir[i][0];
int ny=y+dir[i][1];
//map[nx][ny]='S';
dfs(nx,ny,sum-1);
//v[nx][ny]=0;
//map[nx][ny]='.';
}
v[x][y]=0;
}
int main()
{
int i,j;
while(scanf("%d%d",&n,&m)!=EOF,m||n)
{
bz=0;
num=0;
memset(v,0,sizeof(v));
for(i=0;i<n;i++)
{
scanf("%s",map[i]);
for(j=0;j<m;j++)
{
if(map[i][j]=='.')//记录土地的数量
num++;
}
}
dfs(0,0,num-1);//第一块地已经耕过
if(bz)
printf("YES\n");
else
printf("NO\n");
}
return 0;
}