标签:
Time Limit: 20000/10000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 667 Accepted Submission(s): 366
#include <iostream> #include <queue> #include <algorithm> #include <cstdio> #include <cstring> #include <string> using namespace std; const int MAX = 999991; int G_MAP[][8] = {{0,0,0,0,0,0,0,0}, {11,12,13,14,15,16,17,0}, {21,22,23,24,25,26,27,0}, {31,32,33,34,35,36,37,0}, {41,42,43,44,45,46,47,0}}; int VIS[MAX]; int STEP; unsigned int GOAL_HASH; struct Node { int x,y; }; struct State { int map[5][10]; Node pos[50],blank[4]; unsigned int hash; int step; void operator =(State const & r) { for(int i = 0;i < 5;i ++) for(int j = 0;j < 10;j ++) map[i][j] = r.map[i][j]; for(int i = 0;i < 50;i ++) pos[i] = r.pos[i]; for(int i = 0;i < 4;i ++) blank[i] = r.blank[i]; hash = r.hash; step = r.step; } }; void APhash(State &); int APhash(int (*)[8]); int bfs(State &); void debug(const State &); int main(void) { int n; GOAL_HASH = APhash(G_MAP); scanf("%d",&n); while(n --) { State first; int count_blank = 0,count_num = 0; memset(first.map,0,sizeof(first.map)); for(int i = 0;i < 50;i ++) first.pos[i].x = first.pos[i].y = 0; for(int i = 1;i <= 4;i ++) for(int j = 1;j <= 7;j ++) { Node temp; temp.x = i; temp.y = j; scanf("%d",&first.map[i][j]); int temp_num = first.map[i][j]; if(temp_num % 10 == 1) { first.map[temp_num / 10][0] = temp_num; first.map[i][j] = 0; first.blank[count_blank ++] = temp; } else { first.pos[temp_num].x = i; first.pos[temp_num].y = j; } } first.step = 0; printf("%d\n",bfs(first)); } return 0; } void APhash(State & r) { unsigned hash = 0; for(int i = 1;i <= 4;i ++) for(int j = 0;j < 8;j ++) if(r.map[i][j] & 1) hash ^= (~((hash << 11) ^ r.map[i][j] ^ (hash >> 5))); else hash ^= ((hash << 7) ^ r.map[i][j] ^ (hash >> 3)); r.hash = (hash & 0x7fffffff) % MAX; } int APhash(int (* s)[8]) { unsigned hash = 0; for(int i = 1;i <= 4;i ++) for(int j = 0;j < 8;j ++) if(s[i][j] & 1) hash ^= (~((hash << 11) ^ s[i][j] ^ (hash >> 5))); else hash ^= ((hash << 7) ^ s[i][j] ^ (hash >> 3)); return ((hash & 0x7fffffff) % MAX); } int bfs(State & r) { memset(VIS,0,sizeof(VIS)); queue<State> que; que.push(r); APhash(r); if(r.hash == GOAL_HASH) return r.step; while(!que.empty()) { State cur = que.front(); que.pop(); for(int i = 0;i < 4;i ++) if(cur.blank[i].y >= 1 && cur.blank[i].y <= 7) { State next = cur; int num = cur.map[cur.blank[i].x][cur.blank[i].y - 1] + 1; if((num % 10 == 8) || (num == 1)) continue; next.map[cur.pos[num].x][cur.pos[num].y] = 0; next.map[cur.blank[i].x][cur.blank[i].y] = num; APhash(next); next.step ++; if(VIS[next.hash] == 1) continue; if(next.hash == GOAL_HASH) return next.step; next.pos[num] = cur.blank[i]; next.blank[i] = cur.pos[num]; VIS[next.hash] = 1; que.push(next); } } return -1; } void debug(const State & r) { cout << endl; printf("hash=%d\n",r.hash); for(int i = 1;i <= 4;i ++) { for(int j = 0;j < 8;j ++) printf("%d ",r.map[i][j]); cout << endl; } cout << endl; }
标签:
原文地址:http://www.cnblogs.com/xz816111/p/4378410.html