您的位置:首页 > 其它

六数码

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。
输入样例:

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: