汉诺塔:
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;
}