问题 B: DFS or BFS?
时间限制: 1 Sec 内存限制: 128 MB
提交: 72 解决: 9
题目描述
说好了,题目不黑人。
给你一个8*8的矩阵,你的初始位置是左下角方格(用'U’表示),你的目标位置是右上角的方格(用'A'表示),其余的62个方格,如果是'.',表示这个方格为空,如果是'S',表示这个方格有一块大石头。好了现在你开始从左下角出发,每次可以往上,下,左,右,左上,右上,左下,右下移动一个方格,或者你可以原地不动,一共九个动作方式,在你做完一个动作后,所有的大石头会往下掉一个方格(如果一个大石头的位置是(x,y),那下一秒是(x+1,y),不过如果它已经在最下面的一排了,那它就会掉出矩阵,不再出现),请注意,任一时刻,你不能和某一个大石头处在同一个方格,否则石头会把你XX掉。
现在的问题就是:你能从左下角安全抵达右上角么? 如果能,输出“Yes”,反之,“No”。
输入
T->测试数据组数(T)。
对于每组数据,输入一个8*8的矩阵,其后有一空行。描述如上。
输出
对于第i组数据,请输出
Case #i: s(s是一个字符串,如果可以到达,则s为“Yes”,反之“No”)
样例输入
2
.......A
........
........
........
........
........
........
U.......
.......A
........
........
........
........
.S......
S.......
US......
样例输出
Case #1: Yes
Case #2: No
经验总结
这题,问的是能到达A点么,但实际上,只要能走八步,就一定能到达A了,因为八步之后,所有的石头都没了,所以终点判定一定要写清楚,走完八步就需要进行判定,不然,这个可以走回头路的规则不论是DFS还是BFS分支都是异常庞大的。
emmm,其他的貌似木有什么问题,按照题目的思路来就行啦,哦对,注意一下,处理石头向下落这一过程,应该从最后一行往前替换,从前往后可不行,那样所有的行都是第一行的数据了。
就这些啦~睡觉去~~ZZZ
正确代码
#include <cstdio>
#include <queue>
using namespace std;
struct node
{
int x,y,level;
}Node;
char atlas[8][8];
int direct[9][2]={{-1,-1},{-1,0},{-1,1},{0,-1},{0,0},{0,1},{1,-1},{1,0},{1,1}};
int now_x,now_y;
bool flag;
bool change()
{
for(int i=7;i>=0;i--)
{
for(int j=0;j<8;j++)
{
atlas[i][j]=atlas[i-1][j];
}
}
atlas[1][7]='.';
for(int j=0;j<7;j++)
atlas[0][j]='.';
atlas[0][7]='A';
}
bool judge(int x,int y)
{
if(x<0||x>=8||y<0||y>=8)
return false;
if(atlas[x][y]=='S')
return false;
return true;
}
void dispose(int index)
{
queue<node> Q;
now_x=7;
now_y=0;
Node.x=now_x;
Node.y=now_y;
Node.level=0;
Q.push(Node);
int now_level=0;
int count=0;
while(!Q.empty())
{
node top=Q.front();
if(top.level!=now_level)
{
change();
now_level=top.level;
}
if(atlas[top.x][top.y]=='S')
{
Q.pop();
continue;
}
if(top.level==8)
{
count++;
break;
}
Q.pop();
for(int i=0;i<9;i++)
{
int new_x=top.x+direct[i][0];
int new_y=top.y+direct[i][1];
if(judge(new_x,new_y))
{
Node.x=new_x;
Node.y=new_y;
Node.level=top.level+1;
Q.push(Node);
}
}
}
if(count==0)
printf("Case #%d: No\n",index+1);
else
printf("Case #%d: Yes\n",index+1);
}
int main()
{
int n;
while(~scanf("%d",&n))
{
getchar();
for(int x=0;x<n;x++)
{
for(int i=0;i<8;i++)
{
for(int j=0;j<8;j++)
{
scanf("%c",&atlas[i][j]);
}
getchar();
}
if(x!=n-1)
getchar();
dispose(x);
}
}
return 0;
}