魔板问题

polarbluebear 2012-03-29 10:01:45
1151. 魔板

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
8 6 3 5
用上述三种基本操作,可将任一种状态装换成另一种状态。
Input

输入包括多个要求解的魔板,每个魔板用三行描述。
第一行步数N,表示最多容许的步数。
第二、第三行表示目标状态,按照魔板的形状,颜色用1到8的表示。
当N等于-1的时候,表示输入结束。
Output

对于每一个要求解的魔板,输出一行。
首先是一个整数M,表示你找到解答所需要的步数。接着若干个空格之后,从第一步开始按顺序给出M步操作(每一步是A、B或C),相邻两个操作之间没有任何空格。
注意:如果不能达到,则M输出-1即可。
Sample Input

4
5 8 7 6
4 1 2 3
3
8 7 6 5
1 2 3 4
-1
Sample Output

2 AB
1 A
*********************************************************************************************************
在N比较小的时候用BFS暴力做出来了,当不限制N的时候内存溢出了。。。。
于是加了个数组检查出现过的情况。checkedStatus[].
代码如下,问题是总是运行崩溃,调试也调试不出来。。。
#include<iostream>
#include<string>
#include<queue>
using namespace std;

struct status //建立魔板类
{
string above,below;
string oper;
}start,target;
status checkedStatus[1000];
int num=0;

status change(status cur,status next,int operation) //魔板变换
{
if(operation == 1) //A操作(上下行互换)
{
next.above = next.above+cur.below ;
next.below = next.below+cur.above ;

next.oper = cur.oper + 'A';
}
else if(operation == 2) //B操作(每次以行循环右移一个)
{
next.above = next.above+cur.above[3]+cur.above[0]+cur.above[1]+cur.above[2];
next.below = next.below+cur.below[3]+cur.below[0]+cur.below[1]+cur.below[2];

next.oper = cur.oper + 'B';
}
else if(operation == 3) //C操作(中间四小块顺时针转一格)
{
next.above = next.above+cur.above[0]+cur.below[1]+cur.above[1]+cur.above[3];
next.below = next.below+cur.below[0]+cur.below[2]+cur.above[2]+cur.below[3];

next.oper = cur.oper + 'C';
}
return next;
}
bool isMatch(status a,status b)
{
return(a.above==b.above && a.below == b.below);
}
void bfs(status start,status target,int max)
{
if(isMatch(start,target))
{
cout<<0<<endl;
return;
}
queue<status> q;
q.push(start);
status temp;
while(true)
{
temp=q.front();
q.pop();
if(temp.oper.size() >= max)
{
cout<<-1<<endl;
return;
}
for(int i=1;i<=3;i++)
{
status next;
next = change(temp,next,i);
if(isMatch(next,target))
{
cout<<next.oper.size()<<" "<<next.oper<<endl;
return;
}
for(int i=0;i<=num;i++)
{
if(isMatch(checkedStatus[i],next))
{
break;
}
else if(!isMatch(checkedStatus[i],next)&&i==num)
{
q.push(next);
num++;
checkedStatus[num]= next;
}
}
}
}
}
int main()
{

int max;
string temp;
while(true)
{
start.above="1234";start.below="8765";start.oper="";
target.above = "" ;target.below = "";target.oper = "";
checkedStatus[0]=start;
cin>>max;
if(max==-1)
{
break;
}
for(int i = 0;i < 4;i++)
{
cin>>temp; target.above += temp;
}
for(int j = 0;j < 4;j++)
{
cin>>temp; target.below += temp;
}
bfs(start,target,max);
}
return 0;
}
...全文
289 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
j8daxue 2012-08-25
  • 打赏
  • 举报
回复
sysu的吧?
数量大点BFS就TLE了,其实状态空间有限,可以用康托展开。
http://www.cnblogs.com/sysuwhj/archive/2010/11/28/1890634.html
龙哥依旧 2012-08-25
  • 打赏
  • 举报
回复
魔板我还以为是模板!
:(
polarbluebear 2012-08-25
  • 打赏
  • 举报
回复
后来做出来了。。。

64,652

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧