文章标题 CSU 1856: Sokoban(模拟)

来源:互联网 发布:淘宝导航制作 编辑:程序博客网 时间:2024/05/21 10:45

1856: Sokoban

这里写链接内容
题意:推箱子问题
分析: 找到w的位置;(w && W)
按照题目给的方案模拟;
代码:

#include<iostream>#include<string>#include<cstdio>#include<cstring>#include<vector>#include<math.h>#include<map>#include<queue> #include<algorithm>using namespace std;const int inf = 0x3f3f3f3f;char ch[20][20];int n,m;char s[55]; int check(int x,int y,char c){//在x,y,这个位置执行c命令    int flag=0;//标记能否成功移动     if (c=='U'){//如果是向上走         if (x-1>=1&&ch[x-1][y]=='.'||ch[x-1][y]=='+'){            ch[x-1][y]=ch[x-1][y]=='.'?'w':'W';            ch[x][y]=ch[x][y]=='W'?'+':'.';            flag=1;        }        else if (x-2>=1&&(ch[x-1][y]=='b'||ch[x-1][y]=='B')&&(ch[x-2][y]=='.'||ch[x-2][y]=='+')){            ch[x-2][y]=ch[x-2][y]=='+'?'B':'b';            ch[x-1][y]=ch[x-1][y]=='B'?'W':'w';            ch[x][y]=ch[x][y]=='W'?'+':'.';            flag=1;        }        //return 1;    }    else if (c=='D'){        if (x+1<=n&&ch[x+1][y]=='.'||ch[x+1][y]=='+'){            ch[x+1][y]=ch[x+1][y]=='.'?'w':'W';            ch[x][y]=ch[x][y]=='W'?'+':'.';            flag=1;        }        else if (x+2<=n&&(ch[x+1][y]=='b'||ch[x+1][y]=='B')&&(ch[x+2][y]=='.'||ch[x+2][y]=='+')){            ch[x+2][y]=ch[x+2][y]=='+'?'B':'b';            ch[x+1][y]=ch[x+1][y]=='B'?'W':'w';            ch[x][y]=ch[x][y]=='W'?'+':'.';            flag=1;        }        //return 1;    }    else if (c=='R'){        if (y+1<=m&&ch[x][y+1]=='.'||ch[x][y+1]=='+'){            ch[x][y+1]=ch[x][y+1]=='.'?'w':'W';            ch[x][y]=ch[x][y]=='W'?'+':'.';            flag=1;        }        else if (y+2<=m&&(ch[x][y+1]=='b'||ch[x][y+1]=='B')&&(ch[x][y+2]=='.'||ch[x][y+2]=='+')){            ch[x][y+2]=ch[x][y+2]=='+'?'B':'b';            ch[x][y+1]=ch[x][y+1]=='B'?'W':'w';            ch[x][y]=ch[x][y]=='W'?'+':'.';            flag=1;        }        //return 1;    }    else if (c=='L'){        if (y-1>=1&&ch[x][y-1]=='.'||ch[x][y-1]=='+'){            ch[x][y-1]=ch[x][y-1]=='.'?'w':'W';            ch[x][y]=ch[x][y]=='W'?'+':'.';            flag=1;        }        else if (y-2>=1&&(ch[x][y-1]=='b'||ch[x][y-1]=='B')&&(ch[x][y-2]=='.'||ch[x][y-2]=='+')){            ch[x][y-2]=ch[x][y-2]=='+'?'B':'b';            ch[x][y-1]=ch[x][y-1]=='B'?'W':'w';            ch[x][y]=ch[x][y]=='W'?'+':'.';            flag=1;        }        //return 1;    }    return flag;}int judge(){    int cnt1=0,cnt2=0;    for (int i=1;i<=n;i++){        for (int j=1;j<=m;j++){            if (ch[i][j]=='+')cnt1++;            if (ch[i][j]=='b')cnt2++;        }    }    if (cnt1||cnt2)return 0;    return 1;}int main (){    int cnt=1;    while (cin>>n>>m){        if (n==0&&m==0)break;        for (int i=1;i<=n;i++){            cin>>ch[i]+1;        }        int x,y;        for (int i=1;i<=n;i++){            for (int j=1;j<=m;j++){                if (ch[i][j]=='w'||ch[i][j]=='W'){                    x=i;y=j;//记住一开始的位置                 }            }        }        cin>>s;        int comp=0;        int len=strlen(s);        for (int i=0;i<len;i++){            int flag=check(x,y,s[i]);//在x,y,这个位置执行s[i]命令 //          for (int ii=1;ii<=n;ii++){//              for (int jj=1;jj<=m;jj++){//                  printf ("%c",ch[ii][jj]);//              }//              printf ("\n");//          }            if (flag){                if (s[i]=='U')x--;                else if (s[i]=='D')x++;                else if (s[i]=='R')y++;                else if (s[i]=='L')y--;            }            if (judge()){                comp=1;                break;            }        }        if (comp){            printf ("Game %d: complete\n",cnt++);        }        else {            printf ("Game %d: incomplete\n",cnt++);        }        for (int i=1;i<=n;i++){            for (int j=1;j<=m;j++){                printf ("%c",ch[i][j]);            }            printf ("\n");        }    }       return 0;}