http://codevs.cn/problem/1026/
思路:
需要注意的是,在更新队列时,新添加的点不能重复,但是新添加的点可能与已经在队列中的点重复,所以使用了一个自增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;
}