码迷,mamicode.com
首页 > 其他好文 > 详细

【判重+广搜(bfs)】魔板

时间:2014-10-25 21:22:07      阅读:421      评论:0      收藏:0      [点我收藏+]

标签:style   blog   http   color   io   os   for   strong   sp   

判重+广搜(bfs)】魔板

Time Limit: 1000MS
Memory Limit: 32768KB

Special Judge

有一个两行四列的魔板,每个格子里有一个1到8的数字(数字唯一),现在我们可以对魔板进行以下操作:
1.交换两行的数字。
2.将第一列移到第二列,第二列到第三列,第三列到第四列,第四列到第一列。
3.将中间四个数顺时针转一次。
现给你初始状态,我末状态请你用最小的步数将它从初始状态变到末状态。
输入:
前两行,每行4个数表示初状态。
后两行,每行4个数表示末状态。
输出:
第一行一个数,表示最少步数。
接下来每两行一个状态,依次给出从初状态到末状态的过程。
样例:
输入:
1 2 3 4
5 6 7 8
2 3 4 1
6 7 8 5
输出:
3
1 2 3 4
5 6 7 8
4 1 2 3
8 5 6 7
3 4 1 2
7 8 5 6
2 3 4 1
6 7 8 5

Source
class



judge

 1 # include<cstdio>
 2 # include<cstring>
 3 # include<algorithm>
 4 # include<iostream>
 5 using namespace std;
 6 const int maxn=40000;
 7 int map[maxn][3][5],pre[maxn],end[3][5],num[maxn],vis[maxn];
 8 int head=1,tail=1,cur;
 9 void init(){
10     for(int i=1;i<=2;i++)for(int j=1;j<=4;j++)scanf("%d",&map[1][i][j]);
11     for(int i=1;i<=2;i++)for(int j=1;j<=4;j++)scanf("%d",&end[i][j]);
12 }
13 int check(int head){
14     for(int i=1;i<=2;i++)
15     for(int j=1;j<=4;j++)
16     if(map[head][i][j]!=end[i][j])
17     return 0;
18     return 1;
19 }
20 void one(){
21     tail++;
22     for(int i=1;i<=4;i++)map[tail][1][i]=map[head][2][i];
23     for(int i=1;i<=4;i++)map[tail][2][i]=map[head][1][i];
24     pre[tail]=head;
25     num[tail]=num[head]+1;
26 }
27 void two(){
28     tail++;
29     map[tail][1][1]=map[head][1][4];
30     map[tail][2][1]=map[head][2][4];
31     map[tail][1][2]=map[head][1][1];
32     map[tail][2][2]=map[head][2][1];
33     map[tail][1][3]=map[head][1][2];
34     map[tail][2][3]=map[head][2][2];
35     map[tail][1][4]=map[head][1][3];
36     map[tail][2][4]=map[head][2][3];
37     pre[tail]=head;
38     num[tail]=num[head]+1;
39 }
40 void tree(){
41     tail++;
42     for(int i=1;i<=2;i++)for(int j=1;j<=4;j++)
43     map[tail][i][j]=map[head][i][j];
44     map[tail][1][2]=map[head][2][2];
45     map[tail][1][3]=map[head][1][2];
46     map[tail][2][3]=map[head][1][3];
47     map[tail][2][2]=map[head][2][3];
48     pre[tail]=head;
49     num[tail]=num[head]+1;
50 }
51 void print(int head){
52     printf("%d\n",num[head]);
53     for(int i=pre[head];i!=0;i=pre[i])
54     vis[++cur]=i;
55     for(int i=cur;i>=1;i--)
56     for(int j=1;j<=2;j++){
57     for(int k=1;k<=4;k++)
58     printf("%d ",map[vis[i]][j][k]);
59     printf("\n");
60     }
61     for(int j=1;j<=2;j++){
62     for(int k=1;k<=4;k++)
63     printf("%d ",end[j][k]);
64     printf("\n");
65     }
66 }
67 void bfs(){
68     while(head<=tail){
69         if(check(head)){
70         print(head);
71         return;
72         }
73         one();
74         two();
75         tree();
76         head++;
77     }
78 }
79 int main(){
80     init();
81     bfs();
82     return 0;
83 }

 

【判重+广搜(bfs)】魔板

标签:style   blog   http   color   io   os   for   strong   sp   

原文地址:http://www.cnblogs.com/zoniony/p/4050889.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!