题目链接:wikioi 1026
解题思路:
宽搜,判重使用大数组(不可使用多组测试数据输入,会WA)
代码:
#include <queue>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
bool v[52][52][1005];
int n,m,x,y,cnt,p[1005];
char a[55][55],st[55];
int xx[]={-1,1,0,0};
int yy[]={0,0,-1,1};
struct node{
int x,y,cnt;
node(int x=0,int y=0,int cnt=0):x(x),y(y),cnt(cnt){}
};
int main()
{
scanf("%d %d",&n,&m);
memset(v,0,sizeof(v));
for(int i=0;i<n;i++)
scanf("%s",a[i]);
for(int i=0;i<n;i++)
{
int flag=0;
for(int j=0;j<m;j++)
{
if(a[i][j]=='*')
{
flag=1;
x=i,y=j;
a[x][y]='.';
break;
}
}
if(flag)
break;
}
scanf("%d",&cnt);
for(int i=0;i<cnt;i++)
{
scanf("%s",st);
if(st[0]=='N')
p[i]=0;
else if(st[0]=='S')
p[i]=1;
else if(st[0]=='W')
p[i]=2;
else if(st[0]=='E')
p[i]=3;
}
node head=node(x,y,0);
queue<node> q;
q.push(head);
v[x][y][0]=1;
int index,tmp;
while(!q.empty())
{
head=q.front();
q.pop();
x=head.x,y=head.y,tmp=head.cnt;
if(tmp==cnt)
{
a[x][y]='*';
continue;
}
while(1)
{
x+=xx[p[tmp]],y+=yy[p[tmp]];
if(x>=0&&x<n&&y>=0&&y<m&&a[x][y]!='X')
{
if(!v[x][y][tmp+1])
q.push(node(x,y,tmp+1));
v[x][y][tmp+1]=1;
}
else
break;
}
}
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
printf("%c",a[i][j]);
printf("\n");
}
return 0;
}