本文主要是介绍hdu(1997) 汉诺塔VII,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
若把n个盘子从柱子a通过柱子b移到柱子c,则先把n-1个盘子从柱子a移动柱子b,再把第n个盘子从a移道c,再把n-1个盘子从b移到a。
所以当判断序列是否符合把n个盘子从a移到c时,第n个只能出现在柱子a的最底部,或柱子c的最底部,否则这个序列错的。
当第n个盘子在a的最底部时,则继续判断剩下的序列是否把n-1个盘子从a移到b。
当第n个盘子在c的最底部时,则继续判断剩下的序列是否把n-1个盘子从b移到c。
#include"stdio.h"
#include"string.h"
int map[1000];
int bfs(int n,int a,int b,int c)
{
if(n<=0)//能移完表示全对;
return 1;
if(map[n]==a)//如果最大的一个在a的底部,看是否将n-1个从a移动到b柱上。
{
bfs(n-1,a,c,b);
}
else if(map[n]==b)//如果最大的在b柱上出现过,则出现了错误。
return 0;
else if(map[n]==c)//如果最大的在c柱上,看是否能将n-1个从b柱移动到c柱上。
{
bfs(n-1,b,a,c);
}
}
int main()
{
int n,m,i,j,k,h;
scanf("%d",&k);
while(k--)
{
memset(map,0,sizeof(map));
scanf("%d",&n);
for(i=1;i<=3;i++)
{
scanf("%d",&m);
for(j=1;j<=m;j++)
{
scanf("%d",&h);
map[h]=i;
}
}
if(bfs(n,1,2,3))//123代表abc三根柱子;
printf("true\n");
else
printf("false\n");
}
return 0;
}
这篇关于hdu(1997) 汉诺塔VII的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!