递归8皇后,10皇后以上栈就爆了

#include <stdio.h>

#define N 9
int q[N] = {0};
int cnt = 0;

void print_q() {
    int i;

    for (i=0; i<N; i++) printf("%d ", q[i]);

    printf("\n");

    return;
}

int can_put(int m, int n) {
    int i,j;

    //row is ok
    //colume
    for (i=0; i<m; i++) {
        if (q[i] == n) return 0;
    }

    //left-up
    for (i=m-1,j=n-1; i>=0 && j>=0; i--,j--) {
        if (q[i] == j) return 0;
    }

    //right-up
    for (i=m-1,j=n+1; i>=0 && j<N; i--,j++) {
        if (q[i] == j) return 0;
    }

    return 1;
}

void put_q(int m, int n) {
    if (m == 0 && n >= N) {
        printf("CNT: %d\n", cnt);
    } else if (m >= N) {
        print_q();
        cnt++;
        put_q(m-1, q[m-1]+1);
    } else if (n >= N) {
        put_q(m-1, q[m-1]+1);
    } else if (can_put(m, n)) {
        q[m] = n;
        put_q(m+1, 0);
    }
    else {
        put_q(m, n+1);
    }

    return;
}

int main(int argc, char* argv[]) {
    put_q(0, 0);

    return 0;
}
时间: 2024-11-10 00:07:16

递归8皇后,10皇后以上栈就爆了的相关文章

递归5--汉诺塔问题的栈实现

递归5--汉诺塔问题的栈实现 汉诺塔的递归解法:http://www.cnblogs.com/Renyi-Fan/p/6949515.html 一.心得 系统里面的递归就是靠栈来维护的,区别我们普通栈的是维护递归的那个栈有返回地址递归每深入一层,栈顶元素加一递归每退出一层,栈顶元素减一返回地址是执行完这一层,返回到上一层的地址 就是从栈里面取元素然后操作这个元素,如此循环往复,和队列操作几乎完全一样然而这里用队列不得行,因为最前面的问题分解的子问题没有放在队列最前面 二.分析 三.代码及结果 1

递归的应用——八皇后问题

回朔算法的基本思想 ·从问题的某一种状态出发,搜索可以到达的状态 ·当某个状态到达后,可向前回退,并继续搜索其他可达状态 ·当所有状态都到达后,回朔算法结束 程序设计中可以利用函数的活动对象保存回朔算法的状态数据,因此可以利用递归完成回朔算法. 八皇后算法 1 初始化 I = 1 2 初始化 J = 1 3 从第i行开始,恢复j的当前值,判断第j个位置 A`位置j可放入皇后:标记位置(i,j),i++,转步骤2 B`位置j不可以放入皇后:j++,转至步骤A C`当j>8时,i--,转至步骤3 4

使用深度优先+递归+剪枝解决八皇后问题

n = 4 # 以4皇后举例 result = [] # 放置互斥的列.左斜线.右斜线信息 cols= set() pie = set() na = set() def dfs(row, state): if row >= n: result.append(state) for col in range(n): if col in cols or row + col in pie or row - col in na: continue cols.add(col) pie.add(row + c

BZOJ 3101(N皇后-N皇后O(n)构造一组解的方法)

3101: N皇后 Time Limit: 10 Sec  Memory Limit: 128 MBSec  Special Judge Submit: 70  Solved: 32 [Submit][Status] Description n*n的棋盘,在上面摆下n个皇后,使其两两间不能相互攻击- Input 一个数n Output 第i行表示在第i行第几列放置皇后 Sample Input 4 Sample Output 2 4 1 3 HINT 100%的数据3<n<1000000.输出

N皇后 八皇后 位运算解法

问题描述 什么是八皇后? 题目链接 N皇后 解法 ? 直接在N*N的棋盘上进行深搜,试探着下棋,也就是回溯法. ? 对于一个皇后来说,我们需要判断她的 八个方向 ,即 主对角线,副对角线,行,列 ? 1. 确定状态 ? 第一眼的感觉是要用 四个数组来储存情况,但时间上只需要三个 ,把 行 排除在外 ? 因为每次搜索的时候,都自动按行搜索,也就是变量 row ,每改变一次,代表了不同的行 ? 接下来,分析主对角线 ,对于N*N的矩阵来说,主对角线上的值满足 行和列的差为定值 ? 即,做减法得到的下

数据结构和算法分析(10)表栈和队列的实际应用(二)

    本节继续介绍表.栈.队列在编程实践中的应用.     (1)行编辑程序:(允许用户输入出差错,并在发现错误时可以及时更正.)     功能:接受用户从终端输入的字符型的数据,并存入用户的数据区.由于不能保证不出差错,因此“每接受一个字符即存入用户数据区”的做法不是最恰当的:较好的做法是,设立一个输入的缓冲区,用以接受用户输入的一行字符,然后逐行存入用户数据区. 算法原理:当用户发现刚刚键入的一个字符是错的时,可补进一个退格符“#”,以表示前一个字符无效:如果发现当前键入的行内差错较多或者

LeetCode N皇后 &amp; N皇后 II

题目链接:https://leetcode-cn.com/problems/n-queens/ 题目链接:https://leetcode-cn.com/problems/n-queens-ii/ 题目大意: 略. 分析: https://blog.csdn.net/kai_wei_zhang/article/details/8033194. 代码如下: 1 class Solution { 2 public: 3 int allOne; 4 vector<vector<string>&

C#中八皇后问题的递归解法——N皇后

百度测试部2015年10月份的面试题之——八皇后. 八皇后问题的介绍在此.以下是用递归思想实现八皇后-N皇后. 代码如下: using System;using System.Collections.Generic; namespace QueensSolution { class Program { static int count = 0; static void Main(string[] args) { int n = Int32.Parse(Console.ReadLine()); L

[LeetCode系列]N皇后问题递归解法 -- 位操作方式

N皇后问题: 给定8*8棋盘, 放置n个皇后, 使其互相不能攻击(即2个皇后不能放在同一行/列/正反对角线上), 求解共有多少种放置方式? 这个问题的解答网上有不少, 但是位操作解法的我看到的不多. 下面贴出代码和图解, 也就不赘述了. 1 class Solution { 2 public: 3 /* 使用位操作实现的回溯算法. 按行扫描, 检测可以放置的列. 4 * 'limit' - 都是 '1'. 代表着所有列都被占据了 5 * 'h' - 是目前所有皇后列在行上的垂直投影. 如果 h=