UVa816,Ordering Tasks,WA

#include <iostream>

#include <cstdio>

#include <string>

#include <cstring>

#include <algorithm>

#include <queue>

#include <vector>

using namespace std;

const char*dirs="NESW";

const char*turns="FLR";

int r0,c0,dir,r1,c1,r2,c2,has_edge[20][20][10][6],d[20][20][10];

int dir_id(char c){

    return strchr(dirs,c)-dirs;

}

int turn_id(char c){

    return strchr(turns,c)-turns;

}

int dr[]={-1,0,1,0};

int dc[]={0,1,0,-1};

struct Node{

    int r,c,dir;

};

Node p[20][20][10];

Node walk(Node u,int turn){

    int dir=u.dir;

    if (turn==1) dir=(dir+3)%4;

    if (turn==2) dir=(dir+1)%4;

    Node t;

    t.r=u.r+dr[dir];t.c=u.c+dc[dir];t.dir=dir;

    return t;

}

int init(){

    char ch;

    memset(d,0,sizeof(d));

    cin>>r0>>c0>>ch>>r2>>c2;

    int dir=dir_id(ch);

    r1=r0+dr[dir];c1=c0+dc[dir];

    Node t;

    t.r=r1;t.c=c1;t.dir=dir;

    p[r1][c1][dir]=t;

    int x,y;

    while (cin>>x&&x){

        cin>>y;

        string temp;

        while (cin>>temp&&temp!="*"){

            dir=dir_id(temp[0]);

            for (int i=1;i<temp.size();i++){

                int turn=turn_id(temp[i]);

                has_edge[x][y][dir][turn]=1;

            }

        }

    }

}

int inside(int x,int y){

    return (x>0&&y>0)?1:0;

}

void printf_ans(Node u){

    vector<Node> nodes;

    while (1){

        nodes.push_back(u);

        if (d[u.r][u.c][u.dir]==0) break;

        u=p[u.r][u.c][u.dir];

    }

    Node t;

    t.r=r0;t.c=c0;t.dir=dir;

    nodes.push_back(t);

    int cnt=0;

    for (int i=nodes.size()-1;i>=0;i--){

        if (cnt%10==0) printf(" ");

        printf(" (%d,%d)",nodes[i].r,nodes[i].c);

        if (++cnt %10==0) printf("\n");

    }

    if (nodes.size()%10!=0) printf("\n");

}

void solve(){

    queue<Node>q;

    memset(d,-1,sizeof(d));

    Node u;

    u.r=r1;u.c=c1;u.dir=dir;

    d[u.r][u.c][u.dir]=0;

    q.push(u);

    while (!q.empty()){

        Node u=q.front();q.pop();

        if (u.r==r2&&u.c==c2){

            printf_ans(u);

            return;

        }

        for (int i=0;i<3;i++){

            Node v=walk(u,i);

            if (has_edge[u.r][u.c][u.dir][i]&&inside(v.r,v.c)&&d[v.r][v.c][v.dir]<0){

                d[v.r][v.c][v.dir]=d[u.r][u.c][u.dir]+1;

                p[v.r][v.c][v.dir]=u;

                q.push(v);

            }

        }

    }

    printf("No Solution Possible\n");

}

int main()

{

    string Name;

    while (cin>>Name&&Name!="END"){

        cout<<Name<<endl;

        init();

        solve();

    }

}
View Code

WA代码,至今不知道错哪了........哪位大神若是有时间帮我看看吧,code大部分是刘汝佳第二部书上的

你可能感兴趣的:(order)