六数码
2016-04-25 23:13
232 查看
描述:
现有一两行三列的表格如下:
A B C
D E F
把1、2、3、4、5、6六个数字分别填入A、B、C、D、E、F格子中,每个格子一个数字且各不相同。每种不同的填法称为一种布局。如下:
1 3 5
2 4 6
布局1
2 5 6
4 3 1
布局2
定义α变换如下:把A格中的数字放入B格,把B格中的数字放入E格,把E格中的数字放入D格,把D格中的数字放入A格。
定义β变换如下:把B格中的数字放入C格,把C格中的数字放入F格,把F格中的数字放入E格,把E格中的数字放入B格。
问:对于给定的布局,可否通过有限次的α变换和β变换变成下面的目标布局:
1 2 3
4 5 6
目标布局
输入:
本题有多个测例,每行一个,以EOF为输入结束标志。每个测例的输入是1到6这六个数字的一个排列,空格隔开,表示初始布局ABCDEF格中依次填入的数字。
输出:
每个输出占一行。可以转换的,打印Yes;不可以转换的,打印No。
输入样例:
输出样例:
现有一两行三列的表格如下:
A B C
D E F
把1、2、3、4、5、6六个数字分别填入A、B、C、D、E、F格子中,每个格子一个数字且各不相同。每种不同的填法称为一种布局。如下:
1 3 5
2 4 6
布局1
2 5 6
4 3 1
布局2
定义α变换如下:把A格中的数字放入B格,把B格中的数字放入E格,把E格中的数字放入D格,把D格中的数字放入A格。
定义β变换如下:把B格中的数字放入C格,把C格中的数字放入F格,把F格中的数字放入E格,把E格中的数字放入B格。
问:对于给定的布局,可否通过有限次的α变换和β变换变成下面的目标布局:
1 2 3
4 5 6
目标布局
输入:
本题有多个测例,每行一个,以EOF为输入结束标志。每个测例的输入是1到6这六个数字的一个排列,空格隔开,表示初始布局ABCDEF格中依次填入的数字。
输出:
每个输出占一行。可以转换的,打印Yes;不可以转换的,打印No。
输入样例:
1 3 5 2 4 6 2 5 6 4 3 1
输出样例:
No Yes
#include <iostream> #include <queue> #include <set> #include <string> using namespace std; string goal = "123456"; string Achange(string str) { char t = str[0]; str[0] = str[3]; str[3] = str[4]; str[4] = str[1]; str[1] = t; return str; } string Bchange(string str) { char t = str[1]; str[1] = str[4]; str[4] = str[5]; str[5] = str[2]; str[2] = t; return str; } int main() { char a[7] = {'\0'}; while(cin >> a[0] >> a[1] >> a[2] >> a[3] >> a[4] >> a[5]) { queue<string>q; set<string> visited; string str = a; // for(int i = 0; i < 6; i++) // str[i] = a[i]; q.push(str); visited.insert(str); int flag = 0; while(!q.empty()) { str = q.front(); q.pop(); string Astr = Achange(str); //cout << Astr << endl; if(Astr == goal) { flag = 1; break; } if(visited.find(Astr) == visited.end()) { q.push(Astr); visited.insert(Astr); } if(visited.size() == 720) break; string Bstr = Bchange(str); //cout << Bstr << endl; if(Bstr == goal) { flag = 1; break; } if(visited.find(Bstr) == visited.end()) { q.push(Bstr); visited.insert(Bstr); } if(visited.size() == 720) break; } if(flag) cout << "Yes" << endl; else cout << "No" << endl; } return 0; }
相关文章推荐
- autorelease和autoreleasepool 注意事项优缺点
- Android项目工具类之封装Log工具类
- 5种开原协议的比较
- 【转】JQuery插件ajaxFileUpload 异步上传文件(PHP版)
- Java日期处理类
- Driver development
- mysql innodb启动失败无法重启的处理方法
- win10 下安装ubuntu desktop 双系统
- 简易函数指针
- Group by 和Having 的组合用法
- mysql 中的时间类型的小总结
- 对应对高并发的一些思考
- 2SAT poj3683 Priest John's Busiest Day
- Java中finalize()以及GC
- Shell 脚本知识回顾 (一) —— 基础篇
- BAT清理内存
- (1)参与ardupilot项目编程--概述
- poj 2975 Nim(博弈)
- Hbase 查询过程详解(基于hbase0.98版本后分析的)
- 移动开单扫描终端-全触屏互联网安卓打印扫描 PDAPOS机——开单扫描POS-移动开单扫描POS