zoukankan      html  css  js  c++  java
  • [Swust OJ 1126]--神奇的矩阵(BFS,预处理,打表)

    题目链接:http://acm.swust.edu.cn/problem/1126/

    Time limit(ms): 1000      Memory limit(kb): 65535


    上一周里,患有XX症的哈特13成功解决了填数矩阵问题。
    不知道他这一周又从哪儿弄来一神奇的矩阵,于是逃课潜心研究了一周,终于发现了其中的奥秘:
    该矩阵有2行、4列,即8个小方块,每个小方块上有一个数字,即:
    1 2 3 4
    5 6 7 8
    对于这个神奇的矩阵,有3种变换方式,具体如下:
    变换A:上下两行数字互换,如上图可变为:
    5 6 7 8
    1 2 3 4
    变换B:每行同时向右循环移动一格,如上图可变为:
    4 1 2 3
    8 5 6 7
    变换C:中间4个方块顺时针旋转90度,如上图可变为:
    1 6 2 4
    5 7 3 8


    哈特13虽然发现了这些变换规则,但是他并不知道怎么解决如下问题:
    现在给出一个初始状态和目标状态,怎么变换才能使得矩阵从初始状态变为目标状态且变换步数最少。如果有多种变换方案,输出变换序号字典序最小的那种方案。
    请你帮助他。

    Description

    多组输入,约1000组,直到文件末尾。
    每组数据包括4行,前两行为初始状态,后两行为目标状态。

    Input

    对于每组输入,输出满足要求的变换方案。

    Output
      
    1234
    5678
    5738
    1624

    Sample Input
      
    CA

    Sample Output
    Sorry,由于OJ原因,换行请用
     
    解题思路:直接从初始状态按照3种变换规则BFS,找到达到每个排列状态下的矩阵的最短路径(最少变换次数)找到对应状态下的一个序列值
         (就相当于8个数全排列,直接找这是第几个排列),然后在string 数组中把每个状态的答案存贮了,到时候直接按照状态查找就是
         值得注意的是每个状态下对应的记录数组的下标怎么找(这里有代码和详解:http://www.cnblogs.com/zyxStar/p/4563936.html
    注意:这里有一个坑点,那就是给出的初始序列不一定是12345678,我们需要将其对应过来(wa了n次),具体的看代码吧~~~
     
      1 #include<iostream>
      2 #include<cstring>
      3 #include<string>
      4 #include<map>
      5 #include<queue>
      6 using namespace std;
      7 typedef struct{
      8     string path, mpt;
      9 }node;
     10 int vis[326888];
     11 int cur[] = { 1, 1, 2, 6, 24, 120, 720, 5040, 40320, 326880 };
     12 //依次为1的阶乘,2的阶乘。。。。。8各数在一个数位置确定时剩余   7! 种排列情况,以此类推
     13 string opera[326888];
     14 /******************************************
     15  
     16 寻找对应状态下对应数字编号!!!!
     17 查找 "当前数" 确定情况下剩下的 "排列"
     18 C(n 1)*(n-i)! 当前数状确定态下的排列种数, 依次递推到最后一位叠加,
     19 每一个状态有且只有一个数对应
     20  
     21 *********************************************/
     22 int get_num(string x){
     23     int i, j, a, b, cnt = 0, book[9];
     24     memset(book, 0, sizeof(book));
     25     for (i = 0; i < 8; i++){
     26         a = x[i] - '0', b = 0;
     27         for (j = 1; j < a; j++){
     28             if (!book[j])
     29                 b++;
     30         }
     31         cnt += b*cur[8 - i];
     32         book[a] = 1;
     33     }
     34     return cnt + 1;
     35 }
     36 void bfs(){
     37     queue<node>Q;
     38     node now, next;
     39     now.mpt = "12345678", now.path = "";
     40     Q.push(now);
     41     vis[get_num(now.mpt)] = 1;
     42     while (!Q.empty()){
     43         now = Q.front();
     44         Q.pop();
     45         opera[get_num(now.mpt)] = now.path;
     46         for (int i = 0; i < 3; i++){
     47             next = now;
     48             if (!i){
     49                 next.path += 'A';
     50                 swap(next.mpt[0], next.mpt[4]);
     51                 swap(next.mpt[1], next.mpt[5]);
     52                 swap(next.mpt[2], next.mpt[6]);
     53                 swap(next.mpt[3], next.mpt[7]);
     54             }
     55             else if (i == 1){
     56                 next.path += 'B';
     57                 char s1 = next.mpt[3];
     58                 for (int j = 3; j > 0; j--)
     59                     next.mpt[j] = next.mpt[j - 1];
     60                 next.mpt[0] = s1;
     61                 char s2 = next.mpt[7];
     62                 for (int j = 7; j > 3; j--)
     63                     next.mpt[j] = next.mpt[j - 1];
     64                 next.mpt[4] = s2;
     65             }
     66             else{
     67                 next.path += 'C';
     68                 swap(next.mpt[5], next.mpt[1]);
     69                 swap(next.mpt[5], next.mpt[6]);
     70                 swap(next.mpt[2], next.mpt[6]);
     71             }
     72             if (!vis[get_num(next.mpt)]){
     73                 vis[get_num(next.mpt)] = 1;
     74                 Q.push(next);
     75             }
     76         }
     77     }
     78 }
     79 int main(){
     80     bfs();
     81     string x1, x2, y1, y2;
     82     while (cin >> x1 >> x2 >> y1 >> y2){
     83         x1 += x2, y1 += y2;
     84         pair<char, char>change[10];
     85         for (int i = 1; i <= 8; i++){
     86             change[i].first = x1[i - 1];
     87             change[i].second = i + '0';
     88         }
     89         for (int i = 1; i <= 8; i++)
     90         for (int j = 1; j <= 8; j++){
     91             if (y1[i - 1] == change[j].first){
     92                 y1[i - 1] = change[j].second;
     93                 break;
     94             }
     95         }
     96         cout << opera[get_num(y1)] << "
    ";
     97         //cout << y1;
     98     }
     99     return 0;
    100 }
    View Code
  • 相关阅读:
    Linux架构
    Python标准库09 当前进程信息 (os包)
    Linux从程序到进程
    Python标准库04 文件管理 (部分os包,shutil包)
    Python标准库10 多进程初步 (multiprocessing包)
    Python标准库06 子进程 (subprocess包)
    绘图: matplotlib Basemap简介
    树莓派与Linux
    绘图: Python matplotlib简介
    Linux进程间通信
  • 原文地址:https://www.cnblogs.com/zyxStar/p/4575699.html
Copyright © 2011-2022 走看看