UVA - 816 Abbott's Revenge的坑

这道题太坑了,我格式错误,一直给我报的是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;
}
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值