URAL 1016. Cube on the Walk(搜索)比较难

来源:互联网 发布:车管家软件是什么 编辑:程序博客网 时间:2024/06/06 19:37

题意:给你一个立方体,每一个面都有一个数字。。从一个坐标滚到另一个坐标,使底面的数字之和最小。。

思路:搜索,对每一个坐标记录起底面和前面,,就有24种状态。。。

#include <iostream>#include <cstdio>#include <cstring>#include <algorithm>#include <cmath>#include <queue>using namespace std;const int INF = 0x3f3f3f3f;#define up 3,2,5,1#define down 3,1,5,2#define left 3,6,5,4#define right 3,4,5,6struct cub{    int a[7];    int v[7];    void oper(int i1,int i2,int i3,int i4)    {        int tmp = a[i1];        a[i1]=a[i4],a[i4]=a[i3],a[i3]=a[i2],a[i2]=tmp;        tmp = v[i1];        v[i1]=v[i4],v[i4]=v[i3],v[i3]=v[i2],v[i2]=tmp;    }};struct nod{    int x,y,dis;    cub t;    bool operator<(const nod t) const    {        return dis>t.dis;    }};int dis[10][10][10][10];int pre[10][10][10][10];int Prev[10][10][10][10];priority_queue<nod> que;bool oor(int x,int y){    if(x<0||x>7) return false;    if(y<0||y>7) return false;    return true;}int ans[109][2],cnt;int main(){    freopen("in.txt","r",stdin);    int stx,sty,enx,eny;    char ch[5];    scanf("%s",ch);    stx = ch[0]-'a';sty =ch[1]-'1';    scanf("%s",ch);    enx = ch[0]-'a';eny =ch[1]-'1';    cub tmp;    for(int i=1;i<=6;i++) scanf("%d",&tmp.a[i]),tmp.v[i]=i;    nod e,t;    e.x=stx,e.y=sty,e.dis=tmp.a[5];e.t = tmp;    while(!que.empty()) que.pop();    que.push(e);    memset(dis,-1,sizeof(dis));    dis[stx][sty][5][1] = tmp.a[5];    int anst1,anst2;    while(!que.empty())    {        e = que.top();que.pop();      //  cout<<e.x<<" "<<e.y<<"  "<<e.dis<<" v "<<e.t.v[5]<<endl;      //  for(int i=1;i<7;i++) cout<<e.t.a[i]<<" ";cout<<endl;        //dis[e.x][e.y] = e.dis;        if(e.x==enx&&e.y==eny)        {            anst1 = e.t.v[5];            anst2 = e.t.v[1];            break;        }        if(oor(e.x-1,e.y))        {            t = e;            t.x = e.x-1;            t.t.oper(left);            t.dis+=t.t.a[5];            if(dis[t.x][t.y][t.t.v[5]][t.t.v[1]]>t.dis||dis[t.x][t.y][t.t.v[5]][t.t.v[1]]==-1)            {                dis[t.x][t.y][t.t.v[5]][t.t.v[1]] = t.dis;                pre[t.x][t.y][t.t.v[5]][t.t.v[1]] = 0;                Prev[t.x][t.y][t.t.v[5]][t.t.v[1]] = e.t.v[5]*10+e.t.v[1];                que.push(t);            }        }        if(oor(e.x+1,e.y))        {            t = e;            t.x = e.x+1;            t.t.oper(right);            t.dis+=t.t.a[5];            if(dis[t.x][t.y][t.t.v[5]][t.t.v[1]]>t.dis||dis[t.x][t.y][t.t.v[5]][t.t.v[1]]==-1)            {                dis[t.x][t.y][t.t.v[5]][t.t.v[1]] = t.dis;                pre[t.x][t.y][t.t.v[5]][t.t.v[1]] = 1;                Prev[t.x][t.y][t.t.v[5]][t.t.v[1]] =e.t.v[5]*10+e.t.v[1];                que.push(t);            }        }        if(oor(e.x,e.y-1))        {            t = e;            t.y = e.y-1;            t.t.oper(down);            t.dis+=t.t.a[5];            if(dis[t.x][t.y][t.t.v[5]][t.t.v[1]]>t.dis||dis[t.x][t.y][t.t.v[5]][t.t.v[1]]==-1)            {                dis[t.x][t.y][t.t.v[5]][t.t.v[1]] = t.dis;                pre[t.x][t.y][t.t.v[5]][t.t.v[1]] = 2;                Prev[t.x][t.y][t.t.v[5]][t.t.v[1]] = e.t.v[5]*10+e.t.v[1];                que.push(t);            }        }        if(oor(e.x,e.y+1))        {            t = e;            t.y = e.y+1;            t.t.oper(up);            t.dis+=t.t.a[5];            if(dis[t.x][t.y][t.t.v[5]][t.t.v[1]]>t.dis||dis[t.x][t.y][t.t.v[5]][t.t.v[1]]==-1)            {                dis[t.x][t.y][t.t.v[5]][t.t.v[1]] = t.dis;                pre[t.x][t.y][t.t.v[5]][t.t.v[1]] = 3;                Prev[t.x][t.y][t.t.v[5]][t.t.v[1]] = e.t.v[5]*10+e.t.v[1];                que.push(t);            }        }    }    //return 0;    int tx = enx,ty = eny,td1 = anst1,td2=anst2;   // cout<<enx<<"   ++ "<<eny<<endl;    //ans[cnt][0]=enx,ans[cnt][1]=eny;    while(tx!=stx||ty!=sty||td1!=5||td2!=1)    {       // cout<<tx<<" "<<ty<<"  "<<endl;        int tp1,tp2;        ans[cnt][0]=tx,ans[cnt][1]=ty;        cnt++;        if(pre[tx][ty][td1][td2]==0)        tp1=Prev[tx][ty][td1][td2]/10,tp2=Prev[tx][ty][td1][td2]%10,tx++;        else if(pre[tx][ty][td1][td2]==1)        tp1=Prev[tx][ty][td1][td2]/10,tp2=Prev[tx][ty][td1][td2]%10,tx--;        else if(pre[tx][ty][td1][td2]==2)        tp1=Prev[tx][ty][td1][td2]/10,tp2=Prev[tx][ty][td1][td2]%10,ty++;        else if(pre[tx][ty][td1][td2]==3)        tp1=Prev[tx][ty][td1][td2]/10,tp2=Prev[tx][ty][td1][td2]%10,ty--;        td1=tp1,td2=tp2;    }    ans[cnt][0]=stx,ans[cnt][1]=sty;    printf("%d",dis[enx][eny][anst1][anst2]);    for(;cnt>=0;cnt--)    printf(" %c%d",ans[cnt][0]+'a',ans[cnt][1]+1);    printf("\n");    return 0;}


原创粉丝点击