zoukankan      html  css  js  c++  java
  • hdu 1430

    魔板

    Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
    Total Submission(s): 1649    Accepted Submission(s): 348


    Problem Description
    在魔方风靡全球之后不久,Rubik先生发明了它的简化版——魔板。魔板由8个同样大小的方块组成,每个方块颜色均不相同,可用数字1-8分别表示。任一时刻魔板的状态可用方块的颜色序列表示:从魔板的左上角开始,按顺时针方向依次写下各方块的颜色代号,所得到的数字序列即可表示此时魔板的状态。例如,序列(1,2,3,4,5,6,7,8)表示魔板状态为:

    1 2 3 4
    8 7 6 5

    对于魔板,可施加三种不同的操作,具体操作方法如下:

    A: 上下两行互换,如上图可变换为状态87654321
    B: 每行同时循环右移一格,如上图可变换为41236785
    C: 中间4个方块顺时针旋转一格,如上图可变换为17245368

    给你魔板的初始状态与目标状态,请给出由初态到目态变换数最少的变换步骤,若有多种变换方案则取字典序最小的那种。
     
    Input
    每组测试数据包括两行,分别代表魔板的初态与目态。
     
    Output
    对每组测试数据输出满足题意的变换步骤。
     
    Sample Input
    12345678
    17245368
    12345678
    82754631
     
    Sample Output
     
    C
    AC
     
    Author
    LL
     
    Source
     
     
     
     
      1 #include<iostream>
      2 #include<cstdio>
      3 #include<cstring>
      4 #include<string>
      5 #include<cstdlib>
      6 #include<algorithm>
      7 #include<queue>
      8 using namespace std;
      9 
     10 string start,ans[50000];
     11 int hash[10]={1};
     12 bool vis[50000];
     13 struct node
     14 {
     15     string c,step;
     16     int val;
     17 };
     18 queue<node>Q;
     19 
     20 int ktzk(string s)
     21 {
     22     int i,j,sum = 0;
     23     for(i = 0; i<7; i++)
     24     {
     25         int cnt = 0;
     26         for(j = i+1; j<8; j++)
     27             if(s[i]>s[j])
     28                 cnt++;
     29         sum+=cnt*hash[7-i];
     30     }
     31     return sum;
     32 }
     33 void bfs()
     34 {
     35     node cur,now;
     36     char t[10];
     37     int i,k;
     38     memset(vis,false,sizeof(vis));
     39     cur.c=start;
     40     cur.step="";
     41     cur.val=ktzk(start);
     42     ans[cur.val]="";
     43     vis[cur.val]=true;
     44     Q.push(cur);
     45     while(!Q.empty())
     46     {
     47         cur=Q.front();
     48         Q.pop();
     49         now=cur;//A
     50         for(i=0;i<=3;i++) swap(now.c[i],now.c[7-i]);
     51 
     52         k=ktzk(now.c);
     53         if(vis[k]==false)
     54         {
     55             vis[k]=true;
     56             now.step+='A';
     57             now.val=k;
     58             ans[k]=now.step;
     59             Q.push(now);
     60         }
     61         now=cur;//B
     62         for(i=0;i<8;i++) t[i]=now.c[i];
     63         now.c[0]=t[3];
     64         now.c[1]=t[0];
     65         now.c[2]=t[1];
     66         now.c[3]=t[2];
     67         now.c[4]=t[5];
     68         now.c[5]=t[6];
     69         now.c[6]=t[7];
     70         now.c[7]=t[4];
     71 
     72         k=ktzk(now.c);
     73         if(vis[k]==false)
     74         {
     75             vis[k]=true;
     76             now.step+='B';
     77             now.val=k;
     78             ans[k]=now.step;
     79             Q.push(now);
     80         }
     81         now=cur;
     82         for(i=0;i<8;i++) t[i]=now.c[i];
     83         now.c[1]=t[6];
     84         now.c[2]=t[1];
     85         now.c[5]=t[2];
     86         now.c[6]=t[5];
     87         k=ktzk(now.c);
     88         if(vis[k]==false)
     89         {
     90             vis[k]=true;
     91             now.step+='C';
     92             now.val=k;
     93             ans[k]=now.step;
     94             Q.push(now);
     95         }
     96     }
     97 }
     98 int main()
     99 {
    100     char a[10],b[10],cur[10];
    101     string hxl;
    102     int i,j,k;
    103     for(i=1;i<=8;i++)
    104         hash[i]=hash[i-1]*i;
    105     start="12345678";
    106     bfs();
    107 
    108     while(scanf("%s%s",a,b)>0)
    109     {
    110         for(i=0;i<8;i++)
    111         {
    112             for(j=0;j<8;j++)
    113             {
    114                 if(a[i]==b[j])
    115                 {
    116                     cur[j]='1'+i;
    117                 }
    118             }
    119         }
    120         cur[8]='';
    121         hxl="";
    122         for(i=0;i<8;i++)
    123             hxl+=cur[i];
    124         k=ktzk(hxl);
    125         cout<< ans[k] <<endl;
    126     }
    127     return 0;
    128 }
  • 相关阅读:
    20170421 F110 常见问题
    BAPI_ACC_DOCUMENT_POST 解决原因代码输入问题-利用BADI
    ABAP f4帮助输入多个值
    002 MIRO发票校验采购订单项目科目分配类别检查增强-20150819
    001infor record 计划时间取值增强-20150622
    003 F-47创建预付定金请求检查增强-20150819.docx
    整理开源协议问题 GPL APACHE
    拆我的跨界手环
    ThinkPHP 的一个神秘版本 ThinkPHP 1.2
    关于 Vue 方法前面的美元符号
  • 原文地址:https://www.cnblogs.com/tom987690183/p/3640672.html
Copyright © 2011-2022 走看看