首页 > 代码库 > UVa816,Ordering Tasks,WA

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大部分是刘汝佳第二部书上的

UVa816,Ordering Tasks,WA