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

posted @ 2014-07-26 17:45  ACBingo  阅读(309)  评论(1编辑  收藏  举报