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

欧美三区_成人在线免费观看视频_欧美极品少妇xxxxⅹ免费视频_a级毛片免费播放_鲁一鲁中文字幕久久_亚洲一级特黄

1016. Cube on the Walk

系統 2203 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條評論
主站蜘蛛池模板: 欧美经典成人在观看线视频 | 91久久老司机福利精品网 | 国产探花在线精品一区二区 | 天天成人综合网 | 欧美三级电影在线观看 | 亚洲精品国偷拍自产在线观看 | 黄视频在线观看网站 | 快射视频欧美 | 亚洲福利| 亚洲国产精品国自产电影 | 欧美最新一区二区三区四区 | 日本黄视色视频在线观看 | 泰国一级淫片在线观看 | 国产精品国产三级国产aⅴ中文 | 婷婷激情电影 | 亚洲国产视频网站 | 国产成人综合久久 | 国产精品欧美亚洲日本综合 | 久久成人综合 | 一级黄片毛片 | 欧美日本国产 | 波多野结衣中文丝袜字幕 | 欧美一区视频 | 国产一级毛片高清视频完整版 | 日韩欧美在线看 | 欧美一区二区免费 | 草樱av| 久久久久久久久久免观看 | 亚洲热视频 | 天天操天天舔 | 日韩欧美视频免费观看 | 国产中文av在线 | 涩涩屋av| 正在播放国产精品 | 成人一区二区在线观看视频 | 国产成人精品免费视频大全可播放的 | 天天更新天天久久久更新影院 | 欧美喷潮久久久xxxxx | 欧美日韩综合精品一区二区三区 | 99自拍视频在线观看 | 中文字幕 欧美 日韩 |