ACM习题,求高手解答。

chenyunfeng1987 2010-09-15 10:50:44
RT.题目如下:
魔板由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
用上述三种基本操作,可将任一种状态装换成另一种状态。
[输入]标准输入stdin
输入包括多个要求解的魔板,每个魔板用三行描述。
第一行步数N(不超过10的整数),表示最多容许的步数。
第二、第三行表示目标状态,按照魔板的形状,颜色用1到8的表示。
当N等于-1的时候,表示输入结束。
4
5 8 7 6
4 1 2 3
3
8 7 6 5
1 2 3 4
-1
[输出] 标准输出 stdout
对于每一个要求解的魔板,输出一行。
首先是一个整数M,表示你找到解答所需要的步数。接着若干个空格之后,从第一步开始按顺序给出M步操作(每一步是A、B或C),相邻两个操作之间没有任何空格。
注意:如果不能达到,则M输出-1即可。
2 AB
1 A



注:最好用java实现,C或C++也可。
...全文
152 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
gl378591432 2010-10-10
  • 打赏
  • 举报
回复
回复:
可以编译过啊,注意是C++编译,文件是cpp
如图:
gl378591432 2010-09-16
  • 打赏
  • 举报
回复

参考答案:#include <cstdio>
char hash[ 1 << 24 ]; // hash[i]=得到状态i所用的操作
inline int A( int n)
{
return (n & 4095 ) << 12 | n >> 12 ;
} // 4095=2^12-1
inline int B( int n)
{
return (( 7 << 9 | 7 << 21 ) & n) >> 9 | ( ~ ( 7 << 9 | 7 << 21 ) & n) << 3 ;
}
inline int C( int n)
{
return ( 7 | 7 << 9 | 7 << 12 | 7 << 21 ) & n | (( 7 << 3 ) & n) << 3 | (( 7 << 6 ) & n) << 12 | (( 7 << 18 ) & n) >> 3 | (( 7 << 15 ) & n) >> 12 ;
}
inline int zip( int a[])
{ // 用于将8个数压缩为1个小于2^24(约1670万)的整数
int s = 0 ;
for ( int i = 0 ;i < 8 ; ++ i) s |= (a[i] - 1 ) << ( 3 * i);
return s;
}
int a[] = { 1 , 2 , 3 , 4 , 8 , 7 , 6 , 5 } ; // 初始状态
const int QLen = 10000 ; // 队列长度
int q[QLen],b = 0 ,e = 0 ; // 循环队列及首、尾指针
inline void inc( int & p){ if(++ p ==QLen) p=0;} //用于移动队列首尾指针
int main()
{
int i,j,n,bgn=zip(a);//bgn是初始状态(压缩后)
hash[bgn]='E';
q[b]=bgn; inc(b);
while(b!=e)
{
i=q[e]; inc(e);//取队首
j=A(i);
if(!hash[j]) hash[j]='A', q[b]=j, inc(b);
j=B(i);
if(!hash[j]) hash[j]='B', q[b]=j, inc(b);
j=C(i);
if(!hash[j]) hash[j]='C', q[b]=j, inc(b);
}
char s[100];//s[]用于保存生成的操作序列
while(scanf("%d",&n),n!=-1)
{
for(i=0; i<8; ++i) scanf("%d",&a[i]);
for(i=zip(a),j=0; i!=bgn; ++j)
{
s[j]=hash[i];
switch(s[j])
{
case 'A': i=A(i); break;
case 'B': i=B(B(B(i))); break;
case 'C': i=C(C(C(i))); break;
}
}
if(j>n)
printf("-1\n");
else
{
printf("%d ",j);
while(j--) putchar(s[j]);
putchar('\n');
}
}
return 0;
}
chenyunfeng1987 2010-09-16
  • 打赏
  • 举报
回复
代码编译不过,有错误。

3,881

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 其它技术问题
社区管理员
  • 其它技术问题社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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