标签:
Time Limit: 20000/10000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 690 Accepted Submission(s): 380
1 #include<stdio.h> 2 #include<queue> 3 #include<string.h> 4 typedef long long ll ; 5 int T ; 6 struct Map 7 { 8 int step ; 9 int map[4][8] ; 10 }ans , tmp ; 11 const int bas = 3 ; 12 const int mod = 1000000 + 3 ; 13 struct edge 14 { 15 ll w ; 16 int nxt ; 17 }e[mod]; 18 int H[mod] , E ; 19 void insert (ll x) 20 { 21 int y = x % mod ; 22 if (y < 0) y += mod ; 23 e[++ E].w = y ; 24 e[E].nxt = H[y] ; 25 H[y] = E ; 26 } 27 28 bool find (ll x) 29 { 30 int y = x % mod ; 31 if (y < 0) y += mod ; 32 for (int i = H[y] ; i ; i = e[i].nxt) { 33 if (e[i].w == x) return true ; 34 } 35 return false ; 36 } 37 void bfs (Map ans) 38 { 39 std::queue<Map> q ; 40 while (!q.empty ()) q.pop () ; 41 memset (H , 0 , sizeof(H)) ; E = 0 ; 42 ans.step = 0 ; 43 q.push (ans) ; 44 while (!q.empty ()) { 45 ans = q.front () ; q.pop () ; 46 bool flag = 1 ; 47 for (int i = 0 ; i < 4 && flag ; i ++) for (int j = 0 ; j < 7 && flag ; j ++) if (ans.map[i][j] != (i + 1) * 10 + j + 1) flag = 0 ; 48 if (flag ) { 49 printf ("%d\n" , ans.step) ; 50 return ; 51 } 52 for (int i = 0 ; i < 4 ; i ++) { 53 for (int j = 1 ; j < 8 ; j ++) { 54 tmp = ans ; 55 if (ans.map[i][j] == 0 ) { 56 int num = ans.map[i][j - 1] + 1 ; 57 // printf ("num=%d\n" , num ) ; 58 // printf ("(%d,%d)\n" , i , j ) ; 59 if ((num % 10 > 7 )|| (num % 10 == 1)) continue ; 60 for (int s = 0 ; s < 4 ; s ++) { 61 for (int t = 1 ; t < 8 ; t ++) { 62 if (ans.map[s][t] == num) { 63 tmp.map[i][j] = num ; 64 tmp.map[s][t] = 0 ; 65 } 66 } 67 } 68 ll rhs = 1 ; 69 for (int e = 0 ; e < 4 ; e ++) { 70 for (int f = 1 ; f < 8 ; f ++) { 71 rhs = (rhs * bas + tmp.map[e][f]) % mod ; 72 } 73 } 74 // printf ("rhs=%lld\n" , rhs) ; 75 if ( !find (rhs)) insert (rhs) ; 76 else continue ; 77 tmp.step ++ ; 78 q.push (tmp) ; 79 } 80 } 81 } 82 } 83 puts ("-1") ; 84 } 85 86 int main () 87 { 88 //freopen ("a.txt" , "r" , stdin ) ; 89 scanf ("%d" , &T) ; 90 while (T --) { 91 for (int i = 0 ; i < 4 ; i ++) for (int j = 1 ; j < 8 ; j ++) scanf ("%d" , &ans.map[i][j]) ; 92 for (int i = 0 ; i < 4 ; i ++) for (int j = 1 ; j < 8 ; j ++) if (ans.map[i][j] % 10 == 1) ans.map[i][j] = 0 ; 93 ans.map[0][0] = 11 ; ans.map[1][0] = 21 ; ans.map[2][0] = 31 ; ans.map[3][0] = 41 ; 94 /* for (int i = 0 ; i < 4 ; i ++) { 95 for (int j = 0 ; j < 8 ; j ++) { 96 printf ("%2d " , ans.map[i][j]) ; 97 } 98 puts ("") ; 99 }*/ 100 bfs (ans) ; 101 } 102 return 0 ; 103 }
hash有些没准心,我用那种叫bkdhash,虽说使用上成功率颇高,但我这边交了三发才过。
还有一开始错误认为每个出队的都会产生15种状态,事实上只用4种。
标签:
原文地址:http://www.cnblogs.com/get-an-AC-everyday/p/4451404.html