标签:
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