这道题太坑了,我格式错误,一直给我报的是wa,原来是我最后在如果是第十个而且是最后一个的话,我的会输出两个空行,但其实只要一个空行。还有的坑网上一个人和我踩的差不多(https://blog.csdn.net/kkkksc03/article/details/87854309)
下面是我的代码
#include <iostream>
#include<string.h>
#include<stack>
#include<queue>
#include<utility>
using namespace std;
struct node{
int r,c,dir;
node(){}
node(int x,int y,int z) : r(x), c(y), dir(z){}
};
//node nodes[10000];
int r1,c1,r2,c2;
char dir;
int mp[11][11][4][3];
int used[11][11][4];
node p[11][11][4];
const char *direct="NESW";
const char *turn="FLR";
int dirid(char c){return strchr(direct,c)-direct;}
int turid(char c){return strchr(turn,c)-turn;}
int dx[]={-1,0,1,0};
int dy[]={0,1,0,-1};
node stchag(node &nd,int turn1){
int dirr=nd.dir;
if(turn1==1) dirr=(dirr+3)%4;//左转
if(turn1==2) dirr=(dirr+1)%4;//右转
return node(nd.r+dx[dirr],nd.c+dy[dirr],dirr);
}
int flag=0;
int state;
int mm;
void bfs(){
queue<node>v;
node nod(r1,c1,dirid(dir));
v.push(nod);
while(!v.empty()){
nod=v.front();v.pop();
for(int i=0;i<3;i++){
node no=stchag(nod,i);
if(mp[nod.r][nod.c][nod.dir][i]&&no.r>0&&no.r<=9
&&no.c>0&&no.c<=9&&used[no.r][no.c][no.dir]==0){
v.push(no);
used[no.r][no.c][no.dir]=1;
p[no.r][no.c][no.dir].r=nod.r;
p[no.r][no.c][no.dir].c=nod.c;
p[no.r][no.c][no.dir].dir=nod.dir;
if(no.r==r2&&no.c==c2){ flag=1;state=no.dir;return;}
}
if(mm==0){mm=1;break;}
}
}
}
void print(){
stack<node>s;
s.push(node(r2,c2,state));
int xx,yy,zz;
xx=r2;yy=c2;zz=state;
while(1){
node p1;
if(xx==r1+dx[dirid(dir)]&&yy==c1+dy[dirid(dir)]&&zz==dirid(dir)){s.push(node(r1,c1,dir));break;}
p1=p[xx][yy][zz];
xx=p1.r;yy=p1.c;zz=p1.dir;
s.push(p1);
if(xx==r1+dx[dirid(dir)]&&yy==c1+dy[dirid(dir)]&&zz==dirid(dir)){s.push(node(r1,c1,dir));break;}
}
int t=0;
while(!s.empty()){
node pp;
pp=s.top();s.pop();
if(t%10==0) printf(" (%d,%d)",pp.r,pp.c);
else if(t%10==9) printf(" (%d,%d)\n",pp.r,pp.c);
else printf(" (%d,%d)",pp.r,pp.c);
t++;
}
if((t%10)!=0)cout<<endl;
}
int main()
{
string str;
while(cin>>str){
mm=0;
flag=0;
memset(mp,0,sizeof(mp));
memset(used,0,sizeof(used));
if(str.length()==3&&str[0]=='E'&&str[1]=='N'&&str[2]=='D') break;
scanf("%d %d %c %d %d",&r1,&c1,&dir,&r2,&c2);
mp[r1][c1][dirid(dir)][0]=1;
int x,y;
while(scanf("%d",&x)&&x!=0){
scanf("%d",&y);
char cc[10];
while(scanf("%s",cc)){
if(cc[0]=='*') break;
for(int i=1;i<strlen(cc);i++){
mp[x][y][dirid(cc[0])][turid(cc[i])]=1;
}
}
}
bfs();
if(flag==0){
cout<<str<<endl;
cout<<" No Solution Possible"<<endl;
}else{
cout<<str<<endl;
print();
}
}
return 0;
}