Eight II HDU - 3567

#include<iostream>
#include<queue>
#include<cstring>
#include<string>
#include<vector>

using namespace std;
struct node
{
    int pre;
    int op;
    int x;
    int y;
};
node path[10][370000];
string ps[370000];
int vis[10][370000];
int dir[4][2] = {{-1,0},{0,1},{0,-1},{1,0}};
char ss[4] = { 'u','r','l','d'};
int  fac[] = {1,1,2,6,24,120,720,5040,40320,362880}; //i的阶乘为fac[i]
int Cantor(string s){
    int sum = 0;
    for(int i = 0; i < 9; i++){
        int num = 0;
        for(int j = i+1; j < 9; j++){
            if(s[j] < s[i])
                num++;//确定当前元素i在未出现的元素中是第几个(从小到大)
        }
        sum += fac[8-i] * num;
    }
    return sum;
}

void bfs(int pathi,string inits,int initx,int inity)
{
   
   
    for(int i=0;i<380000;i++)vis[pathi][i] =-1;
    int counts =0;
    path[pathi][counts].pre = -1;
    ps[counts] = inits;
    path[pathi][counts].x=initx;
    path[pathi][counts].y=inity;
    queue<int> qu;
    qu.push(counts);
    int visn;

    visn = Cantor(ps[counts]);
    vis[pathi][visn] =counts;
    counts++;


    while(!qu.empty())
    {
        int f = qu.front();
        //cout<<f<<"  "<<ps[f]<<endl;
        qu.pop();

        //cout<<f<<"  "<<path[pathi][f].op<<"  "<<ps[f]<<endl;

        int x = path[pathi][f].x;
        int y = path[pathi][f].y;

        char tp;
        for(int i=0;i<4;i++)
        {
            int px = x+dir[i][0];
            int py = y+dir[i][1];
            if(px<0||px>2||py<0||py>2)continue;

             tp = ps[f][px*3+py];  // 开始转换
             ps[f][px*3+py] = ps[f][x*3+y];
             ps[f][x*3+y] = tp;



             visn = Cantor(ps[f]);  //判断是否出现过
             if(vis[pathi][visn]!=-1)
             {
                 tp = ps[f][px*3+py];  // 开始转换
                 ps[f][px*3+py] = ps[f][x*3+y];
                 ps[f][x*3+y] = tp;
                 continue;
             }
             vis[pathi][visn] =counts;

             path[pathi][counts].op = i;
             path[pathi][counts].pre = f;
             ps[counts] = ps[f];
             path[pathi][counts].x = px;
             path[pathi][counts].y = py;
             qu.push(counts);
             counts++;




             tp = ps[f][px*3+py];  // 开始转换
             ps[f][px*3+py] = ps[f][x*3+y];
             ps[f][x*3+y] = tp;
        }

    }


}

int main()
{
    int nmap[10];
    //bfs(int pathi,string inits,int initx,int inity);
    bfs(0,"012345678",0,0);
    bfs(1,"102345678",0,1);
    bfs(2,"120345678",0,2);

   bfs(3,"123045678",1,0);
   bfs(4,"123405678",1,1);
   bfs(5,"123450678",1,2);
   bfs(6,"123456078",2,0);
   bfs(7,"123456708",2,1);
   bfs(7,"123456708",2,1);
   bfs(8,"123456780",2,2);

    int t;
    string st;
    string en;

    ios::sync_with_stdio(false);
    //cout<<"dede"<<endl;
    cin>>t;
    for(int ppt=1;ppt<=t;ppt++)
    {
        cin>>st;
        cin>>en;
        int posx;
        int px=1;
        for(int i=0;i<9;i++)
        {
            if(st[i]=='X')
            {
                posx=i;
                continue;
            }
            nmap[st[i]-'0'] = px;
            px++;
        }

        for(int i=0;i<9;i++)
        {
           // cout<<i<<"  ";
            if(en[i]=='X')
            {
                en[i] ='0';
            }
            else en[i] = nmap[en[i]-'0'] + '0';
           // cout<<en[i]<<endl;

        }

        //cout<<st<<"   "<<en<<endl;
        //cout<<posx<<endl;


        int viss;
        viss = Cantor(en);
        vector<char> re1;
        if(vis[posx][viss] !=-1)
        {
            viss = vis[posx][viss];   //获取该点的下标
            //cout<<"vis =" <<vis<<endl;
            while(path[posx][viss].pre!=-1)
            {
                re1.push_back(ss[path[posx][viss].op]);
                viss = path[posx][viss].pre;
            }
            cout<<"Case "<<ppt<<": "<<re1.size()<<endl;
            for(int i = re1.size()-1;i>=0;i--)cout<<re1[i];
            cout<<endl;
        }


    }

    return 0;
}



http://www.voidcn.com/article/p-bctlciua-bcx.html

猜你喜欢

转载自blog.csdn.net/jackcily/article/details/83217226
今日推荐