http://acm.uestc.edu.cn/problem.php?pid=1490&cid=164
其实我已无力吐槽了
只是一次简单的练习,抱着“复习一下”的态度做做
然后一直WA
一直WA
换了各种版本的hash函数无果
调试超过四个小时
一直WA。。。。。让我对未来充满的无力感
然后。。。。。。
发现。。。。。。。。。。
TMD有多组数据。。。。。。测试数据你说明一下可不可以啊
5555555.。。。。。。。
注:此题只是基础练习,所以不是poj和hdu上的八数码,此题只要求输出步数
如果要改成poj上的
只需要添加一个pre数组储存步骤即可
教训:看题看题。用stl简化操作
我以后会补齐用A*和BFS双向的代码。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 |
#include "StdAfx.h" #include <iostream> #include <stdio.h> #include <memory.h> #include <string> #include <queue> #include <math.h> using namespace std; int f[] = {1, 1, 2, 6, 24, 120, 720, 5040, 40320,362880}; // 阶乘表 bool used[362881]; int step[362881]; typedef char State[3][3]; struct node { char x,y; int val; State state; node(){}; node (char xx,char yy,int v,State s) { x=xx;y=yy; val=v; for (int i=0;i<3;i++) for (int j=0;j<3;j++) state[i][j]=s[i][j]; } }; int hashs(State ss) { int i,j,cnt,res=0,jac=1; int s[10]; for (int i=0;i<3;i++) for (int j=0;j<3;j++) s[i*3+j]=ss[i][j]; for(i=1;i<9;++i) { cnt=0; for(j=0;j<i;++j) if(s[j]>s[i]) ++cnt; res+=cnt*f[i]; } return res; } void change(char &a,char &b) { int q=b; b=a;a=q; } queue<node> q; int main() { node a,b; int vv; char c[10]; for (int i=0;i<3;i++) for (int j=0;j<3;j++) { b.state[i][j]=i*3+j+1; } vv=hashs(b.state); b.val=0; b.x=2;b.y=2; memset(used,0,sizeof(used)); used[hashs(b.state)]=true; q.push(b); node t,st; char x,y; while (!q.empty()) { t=q.front(); q.pop(); x=t.x;y=t.y; if (x>0) { st=t; change(st.state[x-1][y],st.state[x][y]); st.x=x-1; st.val+=1; if (! used[hashs(st.state)]) { used[hashs(st.state)]=true; step[hashs(st.state)]=st.val; q.push(node(st.x,st.y,st.val,st.state)); } } if (x<2) { st=t; change(st.state[t.x+1][t.y],st.state[t.x][t.y]); st.x+=1; st.val+=1; if (! used[hashs(st.state)]) { used[hashs(st.state)]=true; step[hashs(st.state)]=st.val; q.push(node(st.x,st.y,st.val,st.state)); } } if (y>0) {st=t; change(st.state[t.x][t.y-1],st.state[t.x][t.y]); st.y-=1; st.val+=1; if (! used[hashs(st.state)]) { used[hashs(st.state)]=true; step[hashs(st.state)]=st.val; q.push(node(st.x,st.y,st.val,st.state)); } } if (y<2) {st=t; change(st.state[t.x][t.y+1],st.state[t.x][t.y]); st.y+=1; st.val+=1; if (! used[hashs(st.state)]) { used[hashs(st.state)]=true; step[hashs(st.state)]=st.val; q.push(node(st.x,st.y,st.val,st.state)); } } } while (1) { for (int i=0;i<3;i++) for (int j=0;j<3;j++) { if(scanf("%s", c) != 1) return 1; else { if(c[0] >= '1' && c[0] <= '8') a.state[i][j] = c[0] - '0'; else {a.state[i][j]=9; a.x=i;a.y=j; } } } if (used[hashs(a.state)]) printf("%d\n",step[hashs(a.state)]); else printf("unsolvable\n"); } return 0; } |