递归
一个函数自己调用自己。
递归和普通函数调用一样都是用栈来实现的。
递归的作用
- 代替多重循环
- 将问题分解为规模更小的子问题再求解
- 解决本来就是用递归形式定义的问题
n皇后
题目
输入整数n,要求n个国际象棋的皇后,摆在n*n的棋盘上,互相不能攻击(使任意的两个皇后都不在同一行、同一列或同一条对角线上),输出全部方案。
代码
#include<stdio.h>
int N; //N个皇后
int queenPos[100]; // 皇后所摆位置,若第i个数为j,则表示第i个皇后摆在第i行第j列
void Nqueen(int k) //在前k-1行摆好的情况下,摆第k行及其后皇后,一行一个皇后
{
int i;
if(k>N) //N个皇后都摆好了
{
for(i=1;i<=N;i++) //输出N个皇后的摆放位置
{
printf("%d ",queenPos[i]);
}
printf("\n");
return ;
}
for(i=1;i<=N;i++) //将第k个皇后摆在第k行第i列
{
int j; //用来枚举前k-1行的皇后
for(j=1;j<k;j++) //检查是否能与前k-1个皇后互相攻击
{
if(i==queenPos[j]||i-queenPos[j]==k-j||i-queenPos[j]==j-k)
break; //能相互攻击则退出当前检测的循环,继续寻找合适的第k个皇后的位置
}
if(j==k) //当与前k-1个皇后不能互相攻击时
{
queenPos[k]=i; //将第k个皇后摆到第k行第i行
Nqueen(k+1); //摆放下一个皇后
}
}
}
int main()
{
scanf("%d",&N);
Nqueen(1); //摆放第i个皇后
return 0;
}