Sicily 1150. 简单魔板

BFS。军训晚上下雨无聊写的水题。

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <algorithm>
 4 #include <cstring>
 5 #include <queue>
 6 #include <vector>
 7 #define rep(i,l,r) for(int i = l; i <= r; i++)
 8 #define clr(x,y) memset(x,y,sizeof(x))
 9 #define travel(x) for(Edge *p = last[x]; p; p = p -> pre)
10 using namespace std;
11 inline int read(){
12     int ans = 0, f = 1; char c = getchar();
13     for(; !isdigit(c); c = getchar()) if (c == ‘-‘) f = -1;
14     for(; isdigit(c); c = getchar()) ans = ans * 10 + c - ‘0‘;
15     return ans * f;
16 }
17 int N, n, target;
18 struct Node{
19     int num; vector <char> path;
20 };
21 queue <Node> q;
22 inline int A(int x){
23     int h = x / 10000; int l = x % 10000;
24     return l * 10000 + h;
25 }
26 inline int B(int x){
27     int h = x / 10000; int l = x % 10000;
28     int hh = h / 10; int hl = h % 10;
29     int lh = l / 10; int ll = l % 10;
30     return hl * 10000000 + hh * 10000 + ll * 1000 + lh;
31 }
32 inline int C(int x){
33     int t[9]; rep(i,1,8){
34         t[8 - i + 1] = x % 10;
35         x = x / 10;
36     }
37     return t[1] * 1e7 + t[6] * 1e6 + t[2] * 1e5 + t[4] * 1e4 + t[5] * 1e3 + t[7] * 1e2 + t[3] * 10 + t[8];
38 }
39 Node bfs(){
40     while (!q.empty()) q.pop();
41     Node s; s.num = 12348765;
42     q.push(s);
43     while (!q.empty()){
44         Node now = q.front(); q.pop();
45         if (now.path.size() > N) return now;
46         else{
47             Node fun1 = now;
48             fun1.num = A(fun1.num);
49             fun1.path.push_back(‘A‘);
50             if (fun1.num == target) return fun1;
51             else q.push(fun1);
52             Node fun2 = now;
53             fun2.num = B(fun2.num);
54             fun2.path.push_back(‘B‘);
55             if (fun2.num == target) return fun2;
56             else q.push(fun2);
57             Node fun3 = now;
58             fun3.num = C(fun3.num);
59             fun3.path.push_back(‘C‘);
60             if (fun3.num == target) return fun3;
61             else q.push(fun3);
62         }
63     }
64 }
65 void work(){
66     target = 0;
67     rep(i,1,8){
68         int x = read(); target = target * 10 + x;
69     }
70     Node out = bfs(); int cnt = out.path.size();
71     if (cnt > N) printf("-1\n");
72     else{
73         printf("%d ",cnt);
74         rep(i,0,cnt - 1) printf("%c",out.path[i]);
75         printf("\n");
76     }
77 }
78 int main(){
79     N = read();
80     while (N != -1){
81         work(); N = read();
82     }
83     return 0;
84 }

时间: 2024-12-28 21:11:24

Sicily 1150. 简单魔板的相关文章

sicily 1150 简单魔方 队列解题

1150. 简单魔板 Constraints Time Limit: 1 secs, Memory Limit: 32 MB , Special Judge Description 魔板由8个大小相同方块组成,分别用涂上不同颜色,用1到8的数字表示. 其初始状态是 1 2 3 4 8 7 6 5 对魔板可进行三种基本操作: A操作(上下行互换): 8 7 6 5 1 2 3 4 B操作(每次以行循环右移一个): 4 1 2 3 5 8 7 6 C操作(中间四小块顺时针转一格): 1 7 2 4

Sicily 1151. 魔板 解题报告

1151_魔板 题目链接: http://soj.me/1151 题目大意: 初始矩阵为: 1 2 3 4 8 7 6 5 有A,B,C三种操作方式来变化矩阵,给定目标矩阵,求要经过多少步能得到目标矩阵,超过步数限制误解则输出-1 思路: 为了操作简单直接用了string来存储矩阵,初始直接为"12348765",每一个状态经过三种变化可以产生三种新的状态,因此可以用宽度优先搜索来查找目标状态.因为最后还要输出变化的过程,所以对于每一个过程状态都要记录下由初始矩阵变化来的步骤.为了方便

Sicily 1151 解题报告(魔板,广搜)

      I.     原题中文大意 魔板由2*4个方块组成,用1到8的数字表示不同的块. 其初始状态是 1 2 3 4 8 7 6 5 对魔板可进行三种基本操作,这三种基本操作,可将任一种状态装换成另一种状态. A (上下行互换) B (行循环右移一格) C (中间四块顺时针转90) 8 7 6 5 1 2 3 4 4 1 2 3 5 8 7 6 1 7 2 4 8 6 3 5 II.       算法思想及解题用到的主要数据结构 广度优先搜索,已搜索过的节点不再进行记录,保证第一个找到的解

hdu1430魔板

Problem Description 在魔方风靡全球之后不久,Rubik先生发明了它的简化版——魔板.魔板由8个同样大小的方块组成,每个方块颜色均不相同,可用数字1-8分别表示.任一时刻魔板的状态可用方块的颜色序列表示:从魔板的左上角开始,按顺时针方向依次写下各方块的颜色代号,所得到的数字序列即可表示此时魔板的状态.例如,序列(1,2,3,4,5,6,7,8)表示魔板状态为: 1 2 3 48 7 6 5 对于魔板,可施加三种不同的操作,具体操作方法如下: A: 上下两行互换,如上图可变换为状

洛谷 P2730 魔板 Magic Squares

P2730 魔板 Magic Squares 题目背景 在成功地发明了魔方之后,鲁比克先生发明了它的二维版本,称作魔板.这是一张有8个大小相同的格子的魔板: 1 2 3 4 8 7 6 5 题目描述 我们知道魔板的每一个方格都有一种颜色.这8种颜色用前8个正整数来表示.可以用颜色的序列来表示一种魔板状态,规定从魔板的左上角开始,沿顺时针方向依次取出整数,构成一个颜色序列.对于上图的魔板状态,我们用序列(1,2,3,4,5,6,7,8)来表示.这是基本状态. 这里提供三种基本操作,分别用大写字母“

P1275 魔板

题目描述 有这样一种魔板:它是一个长方形的面板,被划分成n行m列的n*m个方格.每个方格内有一个小灯泡,灯泡的状态有两种(亮或暗).我们可以通过若干操作使魔板从一个状态改变为另一个状态.操作的方式有两种: (1)任选一行,改变该行中所有灯泡的状态,即亮的变暗.暗的变亮: (2)任选两列,交换其位置. 当然并不是任意的两种状态都可以通过若干操作来实现互相转化的. 你的任务就是根据给定两个魔板状态,判断两个状态能否互相转化. 输入输出格式 输入格式: 文件中包含多组数据.第一行一个整数k,表示有k组

HDU - 1430 - 魔板( 康托展开 + BFS预处理 )

魔板 Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 4242    Accepted Submission(s): 1011 Problem Description 在魔方风靡全球之后不久,Rubik先生发明了它的简化版--魔板.魔板由8个同样大小的方块组成,每个方块颜色均不相同,可用数字1-8分别表示.任一时刻魔板的状态可用方块的颜

Luogu P2730 魔板 Magic Squares

P2730 魔板 Magic Squares 题目背景 在成功地发明了魔方之后,鲁比克先生发明了它的二维版本,称作魔板.这是一张有8个大小相同的格子的魔板: 1 2 3 4 8 7 6 5 题目描述 我们知道魔板的每一个方格都有一种颜色.这8种颜色用前8个正整数来表示.可以用颜色的序列来表示一种魔板状态,规定从魔板的左上角开始,沿顺时针方向依次取出整数,构成一个颜色序列.对于上图的魔板状态,我们用序列(1,2,3,4,5,6,7,8)来表示.这是基本状态. 这里提供三种基本操作,分别用大写字母"

sicily 1151 简单魔方B BFS和哈希判断重复解题

1151. 魔板 Constraints Time Limit: 1 secs, Memory Limit: 32 MB , Special Judge Description 题目和A题相同,在这里我们把数据范围扩大:N可能超过10. 请仔细考虑各种情况. Input 输入包括多个要求解的魔板,每个魔板用三行描述. 第一行步数N,表示最多容许的步数. 第二.第三行表示目标状态,按照魔板的形状,颜色用1到8的表示. 当N等于-1的时候,表示输入结束. Output 对于每一个要求解的魔板,输出一