2023 - DFS or BFS?

通过次数

0

提交次数

0

时间限制 : 1 秒 内存限制 : 128 MB

说好了,题目不黑人。

给你一个8*8的矩阵,你的初始位置是左下角方格(用'U’表示),你的目标位置是右上角的方格('A'表示),其余的62个方格,如果是'.',表示这个方格为空,如果是'S',表示这个方格有一块大石头。好了现在你开始从左下角出发,每次可以往上,下,左,右,左上,右上,左下,右下移动一个方格,或者你可以原地不动,一共九个动作方式,在你做完一个动作后,所有的大石头会往下掉一个方格(如果一个大石头的位置是(xy,那下一秒是(x+1y,不过如果它已经在最下面的一排了,那它就会掉出矩阵,不再出现),请注意,任一时刻,你不能和某一个大石头处在同一个方格,否则石头会把你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

C++解答

#include<stdio.h>
#include<string.h>
#include<queue>
using namespace std;

char mt[9][9][9];

void change(char mt[][9][9])
{
	for(int i=1;i<9;i++)
	{
		int j=1;
		for(;j<=i;j++)
			for(int k=1;k<9;k++)
				mt[i][j][k]='.';
		for(;j<9;j++)
			for(int k=1;k<9;k++)
				mt[i][j][k]=mt[i-1][j-1][k];
	}
}

void printf(char mt[][9][9])
{
	for(int i=0;i<9;i++)
	{
		for(int j=1;j<=8;j++)
		{
			for(int k=1;k<=8;k++)
				printf("%c",mt[i][j][k]);
			printf("\n");
		}
		printf("****************************\n");
		printf("****************************\n");
	}
}

struct node
{
	int x;
	int y;
	int state;
	int step;
};

int walk[9][2]=
{
	0,0,
	1,0,
	1,1,
	0,1,
	-1,0,
	-1,-1,
	0,-1,
	-1,1,
	1,-1,
};

int vis[9][9][9];

int bfs()
{
	node p;
	p.x=8;
	p.y=1;
	p.state=0;
	queue<node>q;
	q.push(p);
	memset(vis,0,sizeof(vis));
	change(mt);
	vis[0][8][1]=1;
	while(!q.empty())
	{
		node tmp=q.front();
		if(tmp.x==1&&tmp.y==8)
		{
			return 1;
		}
		for(int i=0;i<9;i++)
		{
			node tmp=q.front();
			tmp.x+=walk[i][0];
			tmp.y+=walk[i][1];
			if(tmp.x>8||tmp.x<1||tmp.y>8||tmp.y<1)
				continue;
			if(mt[tmp.state][tmp.x][tmp.y]=='S')
				continue;
			if(tmp.state<8)
				tmp.state++;
			if(mt[tmp.state][tmp.x][tmp.y]=='S')
				continue;
			if(vis[tmp.state][tmp.x][tmp.y])
				continue;
			vis[tmp.state][tmp.x][tmp.y]=1;
			q.push(tmp);
		}
		q.pop();
	}
	return 0;
}

int main()
{
	int t;
	//freopen("in.txt","r",stdin);
	scanf("%d",&t);
	getchar();
	int tag=1;
	while(t--)
	{
		printf("Case #%d: ",tag++);
		for(int i=1;i<=8;i++)
		{
			for(int j=1;j<=8;j++)
				scanf("%c",&mt[0][i][j]);
			getchar();
		}
		mt[0][1][8]='.';
		mt[0][8][1]='.';
		if(bfs())
			printf("Yes\n");
		else
			printf("No\n");
		getchar();
	}
	return 0;
}