#include#include#include#include#include" />

亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

1016. Cube on the Walk

系統 2116 0

http://acm.timus.ru/problem.aspx?space=1&num=1016

思路很簡單 就是太繁瑣?

一個立方體把所有面按一定的順序表示的話 無論怎么翻轉 一共有24種順序? 如果是涂色的話? 在顏色可以相同的情況下 種類有可能變少

表示出不同的狀態以后就可以 spfa 求最短路了

代碼:

      #include<iostream>

#include<cstdio>

#include<cstring>

#include<string>

#include<map>

#include<vector>

#include<stack>

#include<set>

#include<map>

#include<queue>

#include<algorithm>

#include<cmath>

#define LL long long

#define sint short int

//#pragma comment(linker, "/STACK:1024000000,1024000000")

using namespace std;

const int N=105;

const int INF=0x3f3f3f3f;

//typedef pair<int,int>point;

struct node

{

    int a[6];

}mem[N];

int I;

vector<int>vx,vy;

int dist[10][10][N];

bool in[10][10][N];

struct node1

{

    int x,y,k;

}f[10][10][N];

void upg(int a[],int b[])

{

    b[0]=a[4];b[1]=a[2];b[2]=a[0];

    b[3]=a[3];b[4]=a[1];b[5]=a[5];

}

void downg(int a[],int b[])

{

    b[0]=a[2];b[1]=a[4];b[2]=a[1];

    b[3]=a[3];b[4]=a[0];b[5]=a[5];

}

void leftg(int a[],int b[])

{

    b[0]=a[0];b[1]=a[1];b[2]=a[3];

    b[3]=a[4];b[4]=a[5];b[5]=a[2];

}

void rightg(int a[],int b[])

{

    b[0]=a[0];b[1]=a[1];b[2]=a[5];

    b[3]=a[2];b[4]=a[3];b[5]=a[4];

}

int add(int a[])

{

    for(int i=0;i<I;++i)

    {

        int j;

        for(j=0;j<6;++j)

        if(a[j]!=mem[i].a[j])

        break;

        if(j==6)

        {return i;}

    }

    for(int i=0;i<6;++i)

    mem[I].a[i]=a[i];

    ++I;

    return -1;

}

void dfs(int a[])

{

    int b[6];

    upg(a,b);

    if(add(b)==-1)

    dfs(b);

    downg(a,b);

    if(add(b)==-1)

    dfs(b);

    leftg(a,b);

    if(add(b)==-1)

    dfs(b);

    rightg(a,b);

    if(add(b)==-1)

    dfs(b);

}

int spfa(int x1,int y1,int k1,int nx,int ny)

{

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

    memset(in,false,sizeof(in));

    queue<int>qtx,qty,qtk;

    qtx.push(x1);

    qty.push(y1);

    qtk.push(k1);

    dist[x1][y1][k1]=mem[k1].a[4];

    in[x1][y1][k1]=true;

    f[x1][y1][k1].x=-1;

    while(!qtx.empty())

    {

        int x2=qtx.front();qtx.pop();

        int y2=qty.front();qty.pop();

        int k2=qtk.front();qtk.pop();

        in[x2][y2][k2]=false;

        int b[6];

        if(y2<7)

        {

            upg(mem[k2].a,b);

            int k=add(b);

            if(dist[x2][y2+1][k]==-1||

               dist[x2][y2+1][k]>dist[x2][y2][k2]+mem[k].a[4])

               {

                   dist[x2][y2+1][k]=dist[x2][y2][k2]+mem[k].a[4];

                   f[x2][y2+1][k].x=x2;

                   f[x2][y2+1][k].y=y2;

                   f[x2][y2+1][k].k=k2;

                   if(!in[x2][y2+1][k])

                   {

                       in[x2][y2+1][k]=true;

                       qtx.push(x2);

                       qty.push(y2+1);

                       qtk.push(k);

                   }

               }

        }

        if(y2>0)

        {

            downg(mem[k2].a,b);

            int k=add(b);

            if(dist[x2][y2-1][k]==-1||

               dist[x2][y2-1][k]>dist[x2][y2][k2]+mem[k].a[4])

               {

                   dist[x2][y2-1][k]=dist[x2][y2][k2]+mem[k].a[4];

                   f[x2][y2-1][k].x=x2;

                   f[x2][y2-1][k].y=y2;

                   f[x2][y2-1][k].k=k2;

                   if(!in[x2][y2-1][k])

                   {

                       in[x2][y2-1][k]=true;

                       qtx.push(x2);

                       qty.push(y2-1);

                       qtk.push(k);

                   }

               }



        }

        if(x2>0)

        {

            leftg(mem[k2].a,b);

            int k=add(b);

            if(dist[x2-1][y2][k]==-1||

               dist[x2-1][y2][k]>dist[x2][y2][k2]+mem[k].a[4])

               {

                   dist[x2-1][y2][k]=dist[x2][y2][k2]+mem[k].a[4];

                   f[x2-1][y2][k].x=x2;

                   f[x2-1][y2][k].y=y2;

                   f[x2-1][y2][k].k=k2;

                   if(!in[x2-1][y2][k])

                   {

                       in[x2-1][y2][k]=true;

                       qtx.push(x2-1);

                       qty.push(y2);

                       qtk.push(k);

                   }

               }



        }

        if(x2<7)

        {

            rightg(mem[k2].a,b);

            int k=add(b);

            if(dist[x2+1][y2][k]==-1||

               dist[x2+1][y2][k]>dist[x2][y2][k2]+mem[k].a[4])

               {

                   dist[x2+1][y2][k]=dist[x2][y2][k2]+mem[k].a[4];

                   f[x2+1][y2][k].x=x2;

                   f[x2+1][y2][k].y=y2;

                   f[x2+1][y2][k].k=k2;

                   if(!in[x2+1][y2][k])

                   {

                       in[x2+1][y2][k]=true;

                       qtx.push(x2+1);

                       qty.push(y2);

                       qtk.push(k);

                   }

               }



        }

    }



    int nk=-1;

    for(int i=0;i<I;++i)

    {

        if((dist[nx][ny][i]!=-1)&&(nk==-1||dist[nx][ny][nk]>dist[nx][ny][i]))

        nk=i;

    }

    int sum=dist[nx][ny][nk];

    vx.clear();vy.clear();

    vx.push_back(nx);vy.push_back(ny);

    while(f[nx][ny][nk].x!=-1)

    {

        int pnx=f[nx][ny][nk].x;

        int pny=f[nx][ny][nk].y;

        int pnk=f[nx][ny][nk].k;

        nx=pnx;ny=pny;nk=pnk;

        vx.push_back(nx);vy.push_back(ny);

    }

    return sum;

}

int main()

{

    //freopen("data.in","r",stdin);

    char c1,c2;

    int x1,x2,y1,y2;

    cin>>c1>>y1;x1=c1-'a';--y1;

    cin>>c2>>y2;x2=c2-'a';--y2;

    int a[6];

    for(int i=0;i<6;++i)

    cin>>a[i];

    I=0;

    if(add(a)==-1)

    dfs(a);

    cout<<spfa(x1,y1,0,x2,y2);

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

    printf(" %c%d",vx[i]+'a',vy[i]+1);

    cout<<endl;



}


    

?

1016. Cube on the Walk


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 欧美中文在线 | 仑乱高清在线一级播放 | 人人爱人人草 | 久久这里只有精品免费播放 | 久久99热国产这有精品 | 网站免费黄色 | 日韩免费影视 | 狠狠躁天天躁夜夜躁婷婷 | 狠狠色噜噜狠狠狠狠97影音先锋 | 色综合久久中文色婷婷 | 毛片毛片毛片毛片毛片毛片毛片 | 国产91在线 | 欧美 | 四虎国产精品影库永久免费 | 99精品wwxx在线观看 | 狠狠色先锋资源网 | 俄罗斯美女逼 | 男女啪网站 | chinese国产在线视频 | 久久国产精品视频一区 | 色好看在线视频播放 | 天天视频黄 | 99精品久久久久久久免费看蜜月 | 伊人日韩| 精品久久久久久影院免费 | 91亚洲区国产区精品区 | 欧美精品在线观看 | 免费观看成人羞羞视频网站观看 | 越猛烈欧美xx00动态图免费 | 免费观看一级欧美在线视频 | 欧美一区二区三区精品国产 | 91国内在线观看 | 久草在线视频在线 | 国产精品第一页爽爽影院 | 一区二区三区无码高清视频 | 在线观看欧美精品 | 精品一区二区三区在线观看 | 日韩精品欧美高清区 | 曰本lesxxxx在线观看视频 | 91在线视频网址 | 桃色视频网 | 97se亚洲国产综合自在线观看 |