题解 CF128A 【Statues】
题目大意
从左下角走到右上角,走的过程中有障碍物。但每走一步时障碍物就会下落一层,问是否能到右上角。
题目分析
这道题主要运用深度优先搜索。由于每走一步障碍物都会下落,所以只需走8次,障碍物都会掉出地图。所以,问题就被转化成了:判断走8次会不会死亡即可。
存图过程中,我们可以将 'S' 标记为 1,之后进行 dfs 即可。细节见代码。
代码
#include<iostream>
#include<cstdio>
using namespace std;
int f[9][9],sx,sy;
int dx[9]= {1,1,1,-1,-1,-1,0,0,0}; //九个方向
int dy[9]= {1,-1,0,1,0,-1,1,-1,0};
int dfs(int sx,int sy,int s)
{
if(s==0) return 1; //s=0时,即已经移动了8步,返回,输出WIN
for(int i=0; i<9; ++i)
{
int nx=dx[i]+sx;
int ny=dy[i]+sy;
if(nx>8 || ny>8 || nx<1 || ny<1) continue; //判断边界
if(f[nx-8+s-1][ny] || f[nx-8+s][ny]) continue; //判断障碍物下落后 和 障碍物下落前 能不能生存
if(dfs(nx,ny,s-1)) return 1; //如果最终存活,返回1
}
return 0;//否则返回0
}
int main()
{
char ch;
for(int i=1; i<=8; ++i)
for(int j=1; j<=8; ++j)
{
cin>>ch;//输入字符
if(ch=='S') f[i][j]=1;//将字符转变成图
else f[i][j]=0;
if(ch=='M') sx=i,sy=j; //判断起点的位置
}
if(dfs(sx,sy,8)) puts("WIN");
else puts("LOSE");
return 0;
}