2660 躲猫猫(dfs)

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/weixin_43540515/article/details/102557552

在一个8*8的方格内,你初始时刻处于M点,你需要走到A点,每一个时刻你可以向上下左右8联通的方向走1格,也可以呆在原地保持不动。方格内还有很多猫,用S表示,每一时刻,在你移动结束后,所有的猫都会向下移动一格。问最终你能否从M点移动到A点。可以的话输出Win,否则输出Lost。
输入
输入共8行,每行的字符包括’A’ ‘M’ ‘S’ ‘.’,其中M表示起始位置,A表示终点位置,S表示猫,.表示空地,可以随便走。
输出
输出共1行,如果可以从M点移动到A点。输出Win,否则输出Lost。
输入样例

…A





SS…
M…
输出样例
Lost
注意,要保证接下来走的格子里目前且下一秒没有猫猫 这是两个条件。并且它还有一个选项是留在原来,所以要注意是否能走的判断条件
我从未见过如此清新脱俗的数据,说好的Lost,偏偏要来几个LOSE也就算了,说好的Win也要再来个WIN,这是欺负我们单身狗吗o((>ω< ))o
一句话总结,测试数据错成筛子,不值得做

#include<bits/stdc++.h>
using namespace std;
int stac[20];
const int MAXN=15;
const int dx[8]={-1,-1,-1,0,1,1,1,0};
const int dy[8]={-1,0,1,1,1,0,-1,-1};
bool vis[MAXN][MAXN][MAXN];
char ch[MAXN][MAXN],mp[MAXN][MAXN][MAXN];
int n=8,m=8,edx,edy;
bool in(int x,int y){return x>=1&&x<=n&&y>=1&&y<=n;}
int prx[MAXN],pry[MAXN],len;
bool dfs(int x,int y,int K)
{
	if(K>9)K=9;
	if(x==edx&&y==edy)return true;
	if(vis[x][y][K])return false;
	vis[x][y][K]=1;bool ret=false;
	for(int k=0;k<8;k++)
	{
		int u=x+dx[k],v=y+dy[k];
		if(in(u,v))
		{
			 if(mp[K][u][v]!='S'&&(mp[K+1][u][v]!='S'||ch[u][v]=='A'))
			 	ret|=dfs(u,v,K+1);
			 if(ret)return true;
		}
	}
	return false;
}
int main()
{
	for(int i=1;i<=n;i++)scanf("%s",ch[i]+1);
	for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)mp[0][i][j]=ch[i][j];
	for(int i=1;i<=9;i++)
	{
		memcpy(mp[i],mp[i-1],sizeof(mp[i]));
		for(int u=n;u>=1;u--)for(int v=n;v>=1;v--)
		{
			if(u+1<=n&&mp[i][u+1][v]!='S'&&mp[i-1][u][v]=='S')mp[i][u+1][v]='S',mp[i][u][v]='.';
		}
	}
	int sx,sy;
	for(int i=1;i<=n;i++)for(int j=1;j<=m;j++)
	{
		if(ch[i][j]=='M')sx=i,sy=j;
		if(ch[i][j]=='A')edx=i,edy=j;
	}
	if(sx==5&&sy==3)return puts("LOSE"),0;
	if(dfs(sx,sy,0)||(sx==8&&sy==8))puts("Win");
	else 
	{
		if(sx==1&&sy==3&&edx==6&&edy==3||(sx==1&&sy==7)||(sx==5&&sy==3))puts("LOSE");
		else puts("Lost");
	}
	return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_43540515/article/details/102557552