递归解决n皇后问题


递归描述:

          递归是最简单的算法了,就是函数重复调用本身。当然我不可能这么敷衍了事,下面先看一下数据在内存中的存放。

栈区(stack):由编译器自动分配并释放,该区域一般存放函数的参数值,局部变量的值等。

堆区(heap):由程序员分配并释放,若程序员不释放,程序运行结束时由操作系统回收。(内存泄漏的事情还是挺可怕的)

寄存器区:用来保存栈顶指针和指令指针。

全局区,又叫静态区(static):全局变量和静态变量是存放在一起的。初始化的全局变量和静态变量放在一起;未初始化的全局变量和静态变量放在相邻的另一区域。程序结束时,由系统回收。

文字常量区:常量字符串放在这里。程序结束时由系统回收。

程序代码区:存放函数体的二进制代码。

  上面的废话结束了,其实本文递归就和栈区的功能有关。哈哈哈,是不是觉得有种练了葵花宝典,最后看到“不用自宫,,也可练此功”的感觉。

  首先,栈是在程序执行前就被系统分配了,也就是说,对于该程序而言,栈的大小是确定的,而且数据是先进后出的顺序。

  然后,需要明白,递归是直接或间接调用函数本身,也就是说,每调用一次,需要将该函数的变量,也就是局部变量进栈一次。

  最后,需要退栈,先退顶层的,也就是函数最后调用那层,当先入栈那层退出后,递归结束。

 

n皇后问题

懒得描述了,问题直接点击n皇后问题。

c++代码如下(看不懂的话,带数据一步一步跑一次,如果还看不懂,评论区留言,当然,欢迎提意见,请尽情的批判我,蹂躏我吧):

#include"iostream"
#include"cstdio"
using namespace std;
int n;
int hashtable[11]={0};
int counter=0;
bool hash_column[11]={false};
int generate(int index)
{
	if(index==n+1)
	{
		bool flag = true;
		for(int i=1;i<=n;i++)
		{
			for(int j=i+1;j<=n;j++)
			{
				if(hashtable[i]==hashtable[j]+j-i || hashtable[i]==hashtable[j]-j+i)
				{
					flag=false;
				}	
			}	
		}
		if(flag)
		{
			counter++;
			for(int i=1;i<=n;i++)
			{
				cout<<"    "<<hashtable[i];
			}
			cout<<endl;
		}
		return 0;
	}
	
		for(int i=1;i<=n;i++)
		{
			if(!hash_column[i])
			{
			hashtable[index]=i;
			hash_column[i] = true;
			generate(index+1);
			hashtable[index]=0;
			hash_column[i]=false;
			}
		} 
	return 0;
	
}


int main()
{
	while(scanf("%d",&n)!=EOF)
	{
		counter=0;
		generate(1);
		if(counter==0)
			cout<<"no solute!"<<endl;
		
	}	
	return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值