-
Notifications
You must be signed in to change notification settings - Fork 0
/
10085.cpp
110 lines (110 loc) · 2.19 KB
/
10085.cpp
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
#include<cstdio>
#include<queue>
#include<algorithm>
#include<cstring>
using namespace std;
int mu[12]={1,1,2,6,24,120,720,5040,40320};
struct data
{
int a[4][4];
int k;
};
data start;
bool vis[400000];
int fa[400000];
char fac[400000];
char s[5]={'U','D','L','R'};
int z[5][2]={{-1,0},{1,0},{0,-1},{0,1}};
int hash(const data & z)
{
int ans=0;
for (int i=1;i<9;i++)
{
int count=0;
for (int k=0;k<i;k++)
if (z.a[k/3][k%3]>z.a[i/3][i%3])
++count;
ans+=count*mu[i];
}
return ans;
}
data out;
int road;
int bfs()
{
memset(vis,0,sizeof(vis));
memset(fa,-1,sizeof(fa));
queue<data> Q;
Q.push(start);
vis[hash(start)]=true;
data tmp;
int ans=0;
while (!Q.empty())
{
data x=Q.front();
Q.pop();
ans=x.k;
out=x;
road=hash(x);
for (int i=0;i<3;i++)
for (int j=0;j<3;j++)
if (x.a[i][j]==0)
{
for (int k=0;k<4;k++)
if (i+z[k][0]<3 && i+z[k][0]>=0 && j+z[k][1]<3 && j+z[k][1]>=0)
{
tmp=x;
tmp.a[i][j]=tmp.a[i+z[k][0]][j+z[k][1]];
tmp.a[i+z[k][0]][j+z[k][1]]=0;
int z=hash(tmp);
if (!vis[z])
{
tmp.k++;
fa[z]=hash(x);
fac[z]=s[k];
vis[z]=true;
Q.push(tmp);
}
}
break;
}
}
return ans;
}
void print_road(int x)
{
if (fa[x]!=-1)
print_road(fa[x]);
else
return ;
putchar(fac[x]);
}
main()
{
int T;
scanf("%d",&T);
int K=0;
while (T--)
{
for (int i=0;i<3;i++)
for (int j=0;j<3;j++)
scanf("%d",&start.a[i][j]);
start.k=0;
int p=bfs();
// printf("%d\n",p);
printf("Puzzle #%d\n",++K);
for (int i=0;i<3;i++)
{
for (int j=0;j<3;j++)
{
if (j) putchar(' ');
printf("%d",out.a[i][j]);
}
putchar('\n');
}
print_road(road);
putchar('\n');
putchar('\n');
}
return 0;
}