zoukankan      html  css  js  c++  java
  • HDOJ 1043 eight

    实际上和POJ 1077一样,但是这里有多组输入,并且有一组输入为12345678x(也就是不需要移动就达到了目标状态),这时还要输出一个空行。

      1 # include <stdio.h>
      2 # include <string.h>
      3 
      4 # define N 9
      5 # define MAXN (362880 + 10)
      6 
      7 typedef struct{ int k; char d; } foot;
      8 typedef struct{ char a[N]; } state;
      9 
     10 const char md[4] = {'u', 'l', 'r', 'd'};
     11 const char d[4][2] = {{-1,0}, {0,-1}, {0,1}, {1,0}};
     12 const int fact[9] = {1, 1, 2, 6, 24, 120, 720, 720*7, 720*56};
     13 
     14 state Q[MAXN/10];  /* 对求最短路足够用了 */
     15 char vis[MAXN];
     16 foot p[MAXN];
     17 
     18 int cantor(state s)
     19 {
     20     char ch;
     21     int i, j, cnt, ret;
     22 
     23     ret = 0;
     24     for (i = 0; i < N-1; ++i)
     25     {
     26         cnt = 0;
     27         ch = s.a[i];
     28         for (j = i+1; j < N; ++j)
     29             if (s.a[j] < ch) ++cnt;
     30         ret += cnt*fact[8-i];
     31     }
     32 
     33     return ret;
     34 }
     35 
     36 char bool_inv(state s)
     37 {
     38     char ch, ret;
     39     int i, j;
     40 
     41     ret = 0;
     42     for (i = 0; i < N-1; ++i)
     43     {
     44         if ((ch = s.a[i]) == 0) continue;
     45         for (j = i+1; j < N; ++j)
     46             if (s.a[j] && s.a[j] < ch) ret = 1 - ret;
     47     }
     48 
     49     return ret;
     50 }
     51 
     52 void print_path(int x, char f)
     53 {
     54     if (p[x].k == 0) return ;
     55     if (f) putchar(md[3-p[x].d]);
     56     print_path(p[x].k, f);
     57     if (!f) putchar(md[p[x].d]);
     58 }
     59 
     60 void bfs(state start, state goal)
     61 {
     62     char t;
     63     state cur, nst;
     64     int front, rear, i;
     65     int x, y, nx, ny, ct, nt;
     66 
     67     memset(Q, 0, sizeof(Q));
     68     memset(p, 0, sizeof(p));
     69     memset(vis, 0, sizeof(vis));
     70 
     71     Q[front = 1] = start;
     72     Q[rear = 2] = goal;
     73     vis[cantor(start)] = 1;
     74     vis[cantor(goal)] = 2;
     75 
     76     while (front <= rear)
     77     {
     78         cur = Q[front++];
     79         ct = cantor(cur);
     80         for (i = 0; cur.a[i] && i < N; ++i) ;
     81         x = i / 3;
     82         y = i % 3;
     83         for (i = 0; i < 4; ++i)
     84         {
     85             nx = x + d[i][0];
     86             ny = y + d[i][1];
     87             if (nx>=0 && nx<3 && ny>=0 && ny<3)
     88             {
     89                 nst = cur;
     90                 nst.a[x*3+y] = cur.a[nx*3+ny];
     91                 nst.a[nx*3+ny] = 0;
     92                 nt = cantor(nst);
     93                 if (!vis[nt])
     94                 {
     95                     Q[++rear] = nst;
     96                     p[nt].k = ct;
     97                     p[nt].d = i;
     98                     vis[nt] = vis[ct];
     99                 }
    100                 else if (vis[ct] != vis[nt])
    101                 {
    102                     t = (vis[ct]==1 ? 1:0);
    103                     print_path(t ? ct:nt, 0);
    104                     putchar(md[t ? i:3-i]);
    105                     print_path(t ? nt:ct, 1);
    106                     putchar('\n');
    107                     return ;
    108                 }
    109             }
    110         }
    111     }
    112 }
    113 
    114 int main()
    115 {
    116     char i, c[5];
    117     state start, goal;
    118 
    119     while(~scanf("%s", c))
    120     {
    121         start.a[0] = (c[0]=='x' ? 0:c[0]-'0');
    122         for (i = 1; i < N; ++i)
    123         {
    124             scanf("%s", c);
    125             start.a[i] = (c[0]=='x' ? 0:c[0]-'0');
    126         }
    127         goal.a[8] = 0;
    128         for (i = 0; i < N-1; ++i)
    129             goal.a[i] = i + 1;
    130 
    131         for (i = 0; start.a[i] == goal.a[i] && i < N; ++i) ;
    132         if (i == N) puts("");
    133         else if (bool_inv(start) != bool_inv(goal)) puts("unsolvable");
    134         else bfs(start, goal);
    135     }
    136 
    137     return 0;
    138 }

    //

  • 相关阅读:
    自学Python三个月能赚钱吗?
    Python如何优雅删除字符列表空字符及None元素
    Python如何对XML 解析
    Python爬虫爬取博客实现可视化过程解析
    更改折旧范围
    尚未被定义为调节科目
    查看事务码
    固定资产创建屏幕分类,必填,字段组规则,折旧科目的设置等
    固定资产配置非税购置的进项税标识符、指定折旧表,分配公司代码
    维护消息
  • 原文地址:https://www.cnblogs.com/JMDWQ/p/2511546.html
Copyright © 2011-2022 走看看