递归与回溯

汉诺塔:
X    Y    Z       --->      X    Y    Z
n                                             n

第一步:把X上面n-1个元素放到Y,把第n个元素放到Z
第二步:把Y上面n-2个元素放到X,把第n-1个元素放到Z
第三步:把X上面n-3个元素放到Y,把第n-2个元素放到Z
第四步:...........
eg:n=3
第一步:把X上面2个元素放到Y,把第3个元素放到Z
第二步:把Y上面1个元素放到X,把第2个元素放到Z
第三步:把X上面0个元素放到Y(输入等于0时候不执行),把第1个元素放到Z

可以总结,只考虑把最下面盘子上的所有元素一下子全部放到空置上,再把底盘移动到Z,使用递归;

/*
X    Y     Z
把X元素放到Z上
*/
#include  <iostream>
using namespace std;
int count=0;
void func(int n,char a,char b,char c)//X    Y     Z
{
	//把上面的n-1个盘子
	//把第n个元素放到Z上
	if(n>0)
	{
	func(n-1,a,c,b);
	cout<<a<<"->"<<c<<endl;
	count++;
	func(n-1,b,a,c);
	}

}
void main()
{
	int num;
	printf("请输入汉诺塔层数:\n");
	cin>>num;
	func(num,'X','Y','Z');
	cout<<"搬运次数:"<<count<<endl;
}

八皇后问题:

回溯法——递归枚举

/*
递归枚举->回溯法
*/
#include <iostream>
using namespace std;
#define  MAX_SIZE  20
//#define  Debug
int count=0;//统计情况次数
int col;
int queen[MAX_SIZE];
void search(int cur)//输入当前行数
{
	if(col==cur)//说明成功了
	{
		count++;
		#ifdef  Debug//打印出结果
		for(int i=0;i<col;i++)//行
		{
			for(int j=0;j<col;j++)//列
			{
				if(queen[i]==j)
					cout<<"1"<<" ";
				else 
					cout<<"0"<<" ";
			}
			cout<<endl;
		}
		cout<<endl;
		#endif
	}else
	{
		for(int i=0;i<col;i++)
		{
			bool isok=true;
			queen[cur]=i;
			for(int j=0;j<cur;j++)//与先前皇后判断是否冲突
			{			
				if(queen[cur]==queen[j]
					||cur-queen[cur]==j-queen[j]
					||cur+queen[cur]==j+queen[j])//重列//左边对角//右边对角
				{
					isok=false;
					break;
				}				
			}
			if(true==isok)
				search(cur+1);
		}
	}
}
void main()
{
	printf("输入矩阵行数:\n");
	cin>>col;
	search(0);
	cout<<"共有解法:"<<count<<endl;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值