逃跑的拉夫爾【黃金題】【寬搜】
阿新 • • 發佈:2018-12-15
思路:
需要注意的是,在更新佇列時,新新增的點不能重複,但是新新增的點可能與已經在佇列中的點重複,所以使用了一個自增index,用來判斷是否多次新增,否則,會造成記憶體超限。
#include<iostream> #include<queue> #include<string> using namespace std; struct Node{ int i, j; Node(int ii,int jj){ i=ii; j=jj; } }; char map[51][51],ans[51][51]; int q_have[51][51];int index=0;//用作判斷某一個點是否新增在更新之後的佇列中。 int n,m,t; queue<Node>q; int main(){ cin>>n>>m; for(int i=1;i<=n;i++){ for(int j=1;j<=m;j++){ cin>>map[i][j]; q_have[i][j]=false; if(map[i][j]=='*'){ q.push(Node(i,j)); q_have[i][j]=index; } } } cin>>t; while(t--){ index++; string opt;cin>>opt; if(opt=="NORTH"){//上 int len=q.size(); while(len--){ Node top=q.front();q.pop(); int i=top.i; int j=top.j; q_have[i][j]=false; for(int k=i-1;k>=1;k--){ if(map[k][j]!='X'){ if(q_have[k][j]!=index) q.push(Node(k,j)); q_have[k][j]=index; }else break; } } }else if(opt=="SOUTH"){//下 int len=q.size(); while(len--){ Node top=q.front();q.pop(); int i=top.i; int j=top.j; for(int k=i+1;k<=n;k++){ if(map[k][j]!='X'){ if(q_have[k][j]!=index) q.push(Node(k,j)); q_have[k][j]=index; }else break; } } }else if(opt=="WEST"){//左 int len=q.size(); while(len--){ Node top=q.front();q.pop(); int i=top.i; int j=top.j; for(int k=j-1;k>=1;k--){ if(map[i][k]!='X'){ if(index!=q_have[i][k]) q.push(Node(i,k)); q_have[i][k]=index; }else break; } } }else if(opt=="EAST"){//右 int len=q.size(); while(len--){ Node top=q.front();q.pop(); int i=top.i; int j=top.j; for(int k=j+1;k<=m;k++){ if(map[i][k]!='X'){ if(index!=q_have[i][k]) q.push(Node(i,k)); q_have[i][k]=index; }else break; } } } } for(int i=1;i<=n;i++){ for(int j=1;j<=m;j++){ ans[i][j]='.'; if(map[i][j]=='X'){ ans[i][j]='X'; } } } while(!q.empty()){ Node top=q.front();q.pop(); ans[top.i][top.j]='*'; } for(int i=1;i<=n;i++){ for(int j=1;j<=m;j++){ cout<<ans[i][j]; }cout<<endl; } return 0; }