[codevs1026] 逃跑的拉尔夫

来源:互联网 发布:水雷的点云数据集 编辑:程序博客网 时间:2024/05/01 11:48

题目链接

题解:闷声大暴力啊啊啊啊

#include <iostream>#include <cstdio>#include <cstring>using namespace std;const int maxn=55;int r,c,sx,sy,n;char s[maxn][maxn],ans[maxn][maxn];int map[maxn][maxn],vis[maxn][maxn][maxn*200],d[maxn*200];;int dx[]={0,-1,1,0,0};int dy[]={0,0,0,-1,1};void dfs(int x,int y,int t){    if(vis[x][y][t]) return ;//判重    vis[x][y][t]=1;    if(!map[x][y]||x>r||y>c||x<1||y<1) return;    if(t>n){        ans[x][y]='*';//找到一个可行点        return;    }    while(map[x][y])//一个指令可以走任意格,所以要用while    {        if(x>r||y>c||x<1||y<1) return;        if(d[t]==1) dfs(--x,y,t+1);        if(d[t]==2) dfs(++x,y,t+1);        if(d[t]==3) dfs(x,--y,t+1);        if(d[t]==4) dfs(x,++y,t+1);    }}int main(){    cin>>r>>c;    for(int i=1;i<=r;i++)   {char ch;     for(int j=1;j<=c;j++)    { cin>>ch;      if(ch=='.'){map[i][j]=1;ans[i][j]='.';}      if(ch=='X'){map[i][j]=0;ans[i][j]='X';}      if(ch=='*'){             map[i][j]=1;ans[i][j]='.';             sx=i;sy=j;            }     }   }    cin>>n;    for(int i=1;i<=n;i++){        string dire;        cin>>dire;        if(dire[0]=='N')    d[i]=1;        if(dire[0]=='S')    d[i]=2;        if(dire[0]=='W')    d[i]=3;        if(dire[0]=='E')    d[i]=4;    }    dfs(sx,sy,1);    for(int i=1;i<=r;i++)    {        for(int j=1;j<=c;j++)        cout<<ans[i][j];        cout<<endl;    }}
0 0