思路
搜索的题目。要注意的是S
会掉下来。砸死人也不行。并且s
可以掉出棋盘,这样的话回溯会有点不方便,所以说我们可以把棋盘数组开大一点,存储着掉下来的s
代码
#include<bits/stdc++.h>
#include<queue>
#include<set>
#include<stack>
#include<vector>
#define ll long long
using namespace std;
const int N=110;
const int M=2023;
const int inf=0x3f3f3f3f;
char a[N][N];
int sx,sy,ex,ey;
int vis[3*N][3*N],viss[N][N];
int dx[10]={0,1,1,1,-1,-1,-1,0,0};
int dy[10]={0,-1,0,1,1,0,-1,1,-1};
int flag,fl;
void change1()
{
for(int i=40;i>=1;i--)
{
for(int j=1;j<=8;j++)
{
if(vis[i][j]==1)
{
vis[i][j]=0;
vis[i+1][j]=1;
}
}
}
}
void change2()
{
for(int i=1;i<=40;i++)
{
for(int j=1;j<=8;j++)
{
if(vis[i][j]==1)
{
vis[i-1][j]=1;
vis[i][j]=0;
}
}
}
}
void dfs(int x,int y)
{
if(x==ex and y==ey)
{
cout<<"WIN";
exit(0);
}
for(int i=0;i<=9;i++)
{
int nx=x+dx[i];
int ny=y+dy[i];
if(nx>=1 and nx<=8 and ny>=1 and ny<=8 and viss[nx][ny]==0 and vis[nx+22][ny]==0 and vis[x+22][y]==0)
{
change1();
viss[nx][ny]=1;
if(vis[nx+22][ny]==0)//保证不会被砸死
dfs(nx,ny);
viss[nx][ny]=0;
change2();
}
}
return;
}
int main()
{
for(int i=1;i<=8;i++)
{
for(int j=1;j<=8;j++)
{
cin>>a[i][j];
if(a[i][j]=='M')sx=i,sy=j;
if(a[i][j]=='A')ex=i,ey=j;
if(a[i][j]=='S')vis[22+i][j]=1;
}
}
dfs(sx,sy);
cout<<"LOSE";
return 0;
}
/*
提供几组样例:
.......A
........
........
........
.S......
S.......
.S......
M.......
LOSE
.......A
........
........
........
........
.SSSSSSS
S.......
M.......
WIN
*/
写的有些简陋,将就一下 QAQ