【codevs 1026】逃跑的拉尔夫

来源:互联网 发布:java病毒代码 编辑:程序博客网 时间:2024/05/16 13:07

BFS+判重(used数组判断有没有用相同k步走到该点)

#include<cstdio>#include<iostream>#include<algorithm>#include<queue>#include<cstring>using namespace std;struct place{    int x,y;};queue<string> q;queue<place> p;int n,m,times;string a;const int maxn=55;bool flag=0,used[maxn][maxn][1005];char ma[maxn][maxn];void bfs(){    int cnt=1;    for(int k=1;k<=times;k++)    {        string b=q.front();        q.pop();        int num=cnt;        cnt=0;        while(num--)        {        place c=p.front();        int x=c.x,y=c.y;        if(b=="NORTH")        {            p.pop();            used[x][y][k]=0;            for(int i=x-1;i>=1;i--)            {                if(ma[i][y]=='X') break;                else if(ma[i][y]=='.'&&!used[i][y][k])                {                    p.push((place){i,y});                     cnt++;                    used[i][y][k]=1;                }            }        }        else if(b=="SOUTH")        {            p.pop();            used[x][y][k]=0;            for(int i=x+1;i<=n;i++)            {                if(ma[i][y]=='X') break;                else if(ma[i][y]=='.'&&!used[i][y][k])                {                    p.push((place){i,y});                    cnt++;                    used[i][y][k]=1;                }            }        }        else if(b=="WEST")        {            p.pop();            used[x][y][k]=0;            for(int i=y-1;i>=1;i--)            {                if(ma[x][i]=='X') break;                else if(ma[x][i]=='.'&&!used[x][i][k])                {                    p.push((place){x,i});                    cnt++;                    used[x][i][k]=1;                }            }        }        else if(b=="EAST")        {            p.pop();            used[x][y][k]=0;            for(int i=y+1;i<=m;i++)            {                if(ma[x][i]=='X') break;                else if(ma[x][i]=='.'&&!used[x][i][k])                {                    p.push((place){x,i});                    cnt++;                    used[x][i][k]=1;                }            }        }      }    }}int main(){    memset(used,0,sizeof(used));    scanf("%d%d",&n,&m);    for(int i=1;i<=n;i++)      for(int j=1;j<=m;j++)      {        cin>>ma[i][j];        if(ma[i][j]=='*') p.push((place){i,j}),ma[i][j]='.',used[i][j][0]=1;      }    scanf("%d",&times);    for(int i=1;i<=times;i++)    {        cin>>a;        q.push(a);    }    bfs();    while(!p.empty())    {        place ha=p.front();        ma[ha.x][ha.y]='*';        p.pop();    }    for(int i=1;i<=n;i++)    {       for(int j=1;j<=m;j++)       {        cout<<ma[i][j];       }       cout<<endl;    }    return 0;}

深搜版(orz Loi_Leporidae)

#include<cstdio>#include<iostream>#include<cstring>#include<queue>#include<algorithm>using namespace std;int r,c,times,sx,sy;char mp[55][55];char a[55];int d[1005];bool ans[55][55],vis[55][55][1005];int dx[5]={0,-1,1,0,0};//N S E Wint dy[5]={0,0,0,1,-1};bool could(int x,int y,int step){    if(x>=1&&x<=r)    {        if(y>=1&&y<=c)        {            if(mp[x][y]!='X')            {                if(!vis[x][y][step])                  return true;            }        }    }    return false;}void dfs(int x,int y,int di,int step){       if(step==times+1)    {        ans[x][y]=1;        return;    }     vis[x][y][step]=1;    if(could(x+dx[di],y+dy[di],step))        dfs(x+dx[di],y+dy[di],di,step);    if(could(x+dx[d[step+1]],y+dy[d[step+1]],step+1))        dfs(x+dx[d[step+1]],y+dy[d[step+1]],d[step+1],step+1);}int main(){    scanf("%d%d",&r,&c);    for(int i=1;i<=r;i++)    {        scanf("%s",a+1);        for(int j=1;j<=c;j++)        {            mp[i][j]=a[j];            if(a[j]=='*')             {                mp[i][j]='.';                sx=i,sy=j;            }        }    }    scanf("%d",&times);    for(int i=1;i<=times;i++)    {        scanf("%s",&a);        if(a[0]=='N') d[i]=1;        else if(a[0]=='S') d[i]=2;        else if(a[0]=='E') d[i]=3;        else if(a[0]=='W') d[i]=4;    }    dfs(sx+dx[d[1]],sy+dy[d[1]],d[1],1);//next_pos director step    for(int i=1;i<=r;i++)    {        for(int j=1;j<=c;j++)        {           if(ans[i][j]) printf("*");           else printf("%c",mp[i][j]);        }        printf("\n");    }    return 0;} 
原创粉丝点击