4054 Problem B DFS or BFS?

 

问题 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;
}

猜你喜欢

转载自blog.csdn.net/a845717607/article/details/81369075