USACO3.2.4 mequare
来源:互联网 发布:张艺兴网络剧 编辑:程序博客网 时间:2024/06/05 19:17
2017年5月6日 | ljfcnyali
题目大意
在成功地发明了魔方之后,鲁比克先生发明了它的二维版本,称作魔板。这是一张有8个大小相同的格子的魔板:
1 2 3 4
8 7 6 5
我们知道魔板的每一个方格都有一种颜色。这8种颜色用前8个正整数来表示。可以用颜色的序列来表示一种魔板状态,规定从魔板的左上角开始,沿顺时针方向依次取出整数,构成一个颜色序列。对于上图的魔板状态,我们用序列(1,2,3,4,5,6,7,8)来表示。这是基本状态。
这里提供三种基本操作,分别用大写字母“A”,“B”,“C”来表示(可以通过这些操作改变魔板的状态):
“A”:交换上下两行;
“B”:将最右边的一列插入最左边;
“C”:魔板中央四格作顺时针旋转。
下面是对基本状态进行操作的示范:
A: 8 7 6 5
1 2 3 4
B: 4 1 2 3
5 8 7 6
C: 1 7 2 4
8 6 3 5
对于每种可能的状态,这三种基本操作都可以使用。
你要编程计算用最少的基本操作完成基本状态到目标状态的转换,输出基本操作序列。
Sample Input
2 6 8 4 5 7 3 1
Sample Output
7 BCABCCB
题目分析
BFS水过!
AC代码
/*ID: jerry272PROG: msquareLANG: C++*/#include<iostream>#include<cstdio>#include<set>#include<cstring>#include<queue>#include<cmath>#include<cstdlib>#include<vector>#include<algorithm>#include<map>#define to(a,b,c,d,e,f,g,h) (((long long)(a)<<0)|((long long)(b)<<8)|((long long)(c)<<16)|((long long)(d)<<24)|((long long)(e)<<32)|((long long)(f)<<40)|((long long)(g)<<48)|(long long)(h)<<56) #define REP(i, a, b) for ( int i = (a), _end_ = (b); i <= _end_; ++ i)#define mem(a) memset ( (a), 0, sizeof (a))#define str(a) strlen (a);using namespace std;long long num[]={0x00000000000000FFLL,0x000000000000FF00LL,0x0000000000FF0000LL,0x00000000FF000000LL,0x000000FF00000000LL,0x0000FF0000000000LL,0x00FF000000000000LL,0xFF00000000000000LL};struct node{ long long status; string str; }st, ans;int s[8], tmp[8];long long ed = to(1, 2, 3, 4, 5, 6, 7, 8);queue <node> Q;set <long long> S;int f;void bfs() { while(!Q.empty()) Q.pop(); long long ed = to(s[0], s[1], s[2], s[3], s[4], s[5], s[6], s[7]); st.status = to(1, 2, 3, 4, 5, 6, 7, 8); st.str = ""; Q.push(st); S.clear(); while(!Q.empty()){ struct node now = Q.front(); Q.pop(); if(S.count(now.status) > 0) continue; if(ed == now.status) { ans = now; return; } S.insert(now.status); REP(i, 0, 7) s[i] = ((num[i] & now.status) >> i * 8); swap(s[0], s[7]); swap(s[1], s[6]); swap(s[2], s[5]); swap(s[3], s[4]); //A struct node temp; temp.status = to(s[0], s[1], s[2], s[3], s[4], s[5], s[6], s[7]); temp.str = now.str + "A"; Q.push(temp); swap(s[0], s[7]); swap(s[1], s[6]); swap(s[2], s[5]); swap(s[3], s[4]); //A swap(s[0], s[1]); swap(s[7], s[6]); //B swap(s[0], s[2]); swap(s[7], s[5]); swap(s[0], s[3]); swap(s[7], s[4]); temp.status = to(s[0], s[1], s[2], s[3], s[4], s[5], s[6], s[7]); temp.str = now.str + "B"; Q.push(temp); REP(i, 0, 7) s[i] = ((num[i] & now.status) >> i * 8); swap(s[1], s[2]); swap(s[1], s[5]); swap(s[1], s[6]); //C temp.status = to(s[0], s[1], s[2], s[3], s[4], s[5], s[6], s[7]); temp.str = now.str + "C"; Q.push(temp); }}int main() { freopen("msquare.in", "r", stdin); freopen("msquare.out", "w", stdout); int t; REP(i, 0, 7) scanf("%d", &s[i]); bfs(); cout << ans.str.size() << endl; cout << ans.str << endl;}
本文转自:http://ljf-cnyali.cn/index.php/archives/138
阅读全文
0 0
- USACO3.2.4 mequare
- [USACO3.2.4 Feed Ratios]
- usaco3.2.4 Feed Ratios
- usaco3.2.4纺车的轮子
- USACO3.2.4 Feed Ratios (ratios)
- USACO3.2.4 Feed Ratios (ratios)
- 【USACO3.2.4】饲料调配 纯整数高斯消元
- 【例题】【高斯消元】USACO3.2.4 Feed Ratios
- usaco3.4.1
- USACO3.3
- USACO3.1.6
- usaco3.2kimbits
- usaco3.3Camelot
- USACO3.3.3DP
- [模拟][usaco3.2.1]阶乘
- usaco3.1.3总分
- usaco3.1.6联系
- usaco3.1.4丑数
- XHTML1.0 vs HTML4.0比较
- C语言杂散问题
- 基于FPGA的GV7600驱动
- OLED屏使用
- CentOS6.5上安装Python2.7和PIP
- USACO3.2.4 mequare
- W5500使用
- hibernate查询、连接池、二级缓存
- 缓存淘汰算法--LRU算法
- Java接口与抽象类的区别
- 算法与数据结构(2) -- 二叉树深度优先遍历和广度优先遍历
- 服务器(4)--搭建Solr集群+搭建Zookeeper集群(上篇)
- ZCMU—1933
- 深度学习 2 : BP 算法