算法实验三 【六数码】分支限界
1045.六数码问题
时限:1000ms 内存限制:10000K 总时限:3000ms
描述
现有一两行三列的表格如下:
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>
using namespace std;
struct node
{
int table[6];
int num;
};
node start;
queue<node>q;
int used[654322];
void init();
int setnum(node n1);
bool bfs();
bool istarget(node n1);
node operate(node now,int i);
int main()
{
while(cin>>(start.table[0]))
{
for(int i=1;i<6;i++)
{
cin>>(start.table[i]);
}
start.num=setnum(start);
init();
if(bfs()) cout<<"Yes"<<endl;
else cout<<"No"<<endl;
}
return 0;
}
void init()
{
for(int i=123456;i<654322;i++)
{
used[i]=0;
}
while(!q.empty())
{
q.pop();
}
q.push(start);
used[start.num]=1;
}
int setnum(node n1)
{
n1.num=0;
for(int i=0;i<6;i++)
{
n1.num*=10;
n1.num+=n1.table[i];
}
return n1.num;
}
bool bfs()
{
node now,next;
while(!q.empty())
{
now=q.front();
q.pop();
for(int i=0;i<2;i++)
{
next=operate(now,i);
if(!used[next.num])
{
used[next.num]=1;
if(istarget(next)) return true;
else q.push(next);
}
}
}
return false;
}
node operate(node now,int i)
{
node next;
if(i==0)
{
next.table[0]=now.table[3];
next.table[1]=now.table[0];
next.table[2]=now.table[2];
next.table[3]=now.table[4];
next.table[4]=now.table[1];
next.table[5]=now.table[5];
}
if(i==1)
{
next.table[0]=now.table[0];
next.table[1]=now.table[4];
next.table[2]=now.table[1];
next.table[3]=now.table[3];
next.table[4]=now.table[5];
next.table[5]=now.table[2];
}
next.num=setnum(next);
return next;
}
bool istarget(node n1)
{
if(n1.num==123456) return true;
else return false;
}
bfs的套路就是
while(!q.empty()
{
now=q.front;
q.pop();
for( )
{
…
…
if(istarget())
…
}
10.27复习
最主要的是怎样表示数据使之能够写成这种形式。
现在代码基本上就是初始化函数,bfs函数,main函数,istarget函数
其他函数就是为了将问题转化成上述表达形式而存在的。
(其实我不是非常想把数据表示成结构体形式,就是有点抗拒,所以一直尝试用数组,但是对于这道题,浪费了很久时间,但是也没有解决…我太菜了,不过这次用了结构体之后,我发现还有点好用(真香 克服抗拒也算收获叭嘻嘻嘻)