循环8皇后

这回不会爆栈了,但是效率很低,O(n^2)的时间复杂度,需要优化

#include <stdio.h>

#define N 10
int q[N+1] = {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 next_qn() {
    int i=0;
    while (i <= N) {
        if (q[i] < N-1) {
            q[i] +=1;
            break;
        }

        q[i] = 0;
        i++;
    }

    return;
}

int main(int argc, char* argv[]) {
    while (q[N] == 0) {
        int i;

        for (i=0; i<N; i++) {
            if (!can_put(i, q[i])) break;
        }

        if (i == N) {
            cnt++;
            print_q();
        }

        next_qn();
    }

    printf("CNT: %d\n", cnt);

    return 0;
}
时间: 2024-11-05 06:25:50

循环8皇后的相关文章

优化后的循环8皇后

去掉重复判断,这样应该基本没问题了 到wiki上去验证数据是否正确:http://zh.wikipedia.org/wiki/%E5%85%AB%E7%9A%87%E5%90%8E%E9%97%AE%E9%A2%98 #include <stdio.h> #define N 13 int q[N] = {0}; int not_end=1; int cnt = 0; void print_q() { int i; for (i=0; i<N; i++) printf("%d &

递归--N皇后问题

用递归替代多重循环n皇后问题:输入整数n, 要求n个国际象棋的皇后,摆在n*n的棋盘上,互相不能攻击,输出全部方案.八皇后问题:八重循环.n皇后,n重循环? N皇后问题输入一个正整数N,则程序输出N皇后问题的全部摆法.输出结果里的每一行都代表一种摆法.行里的第i个数字如果是n,就代表第i行的皇后应该放在第n列.皇后的行.列编号都是从1开始算.样例输入:4样例输出:2 4 1 33 1 4 2 python代码如下: import sys #输入的皇后数量 N = 0 #描述第几种方案的值 Num

java实现八皇后问题(递归和循环两种方式)

循环方式: package EightQueens; public class EightQueensNotRecursive { private static final boolean AVAILABLE = true; private int squares = 8, norm = squares - 1; private int positionInRow[] = new int[squares]; private int p=-1; private boolean[] rows = n

N皇后问题--回溯法 (循环递归)

N皇后问题 问题描述:N皇后问题是一个经典的问题,在一个N*N的棋盘上放置N个皇后,每行一个并使其不能互相攻击(同一行.同一列.同一斜线上的皇后都会自动攻击) 思路 (回溯法,循环递归):0. 初始化棋盘(全部为0)1. 依次将第一列棋子置为12. 放完棋子执行横向,纵向,斜向的update,把不能放棋子的位置置为23. 从第二列棋子开始,递归执行4. 执行到最后一列,退出递归5. 执行第一列的第二个棋子 实现: var N = 4; Array.prototype.count = functi

8皇后问题--回溯法 (循环递归)

N皇后问题 问题描写叙述:N皇后问题是一个经典的问题,在一个N*N的棋盘上放置N个皇后,每行一个并使其不能互相攻击(同一行.同一列.同一斜线上的皇后都会自己主动攻击) 1.因为每一个棋子不可能同行.因此能够理解为从棋盘每行拿个棋子出来2.因为每列棋子也不同样,因此没有同一个数字能够在一个列3.综合1,2.问题转化为给[0-7]做全排列,然后满足没有两个数字在同一个斜线4.依据斜率公式 (x1-x2)/(y1-y2),因此依据这个条件排出同线的组合5.余下的组合即为每行棋子的列位置,索引,就是行号

八皇后问题

#include <stdio.h> #include <stdlib.h> #define Maxsize 100 typedef struct node{ int _x; int _y; }chessman,*chess; static int cnt=0; static chessman c[Maxsize]; bool isOK(chess c,chessman cm,int c_len){ //判断是否能将当前皇后加入棋盘中 for(int i=0;i<c_len;

2n皇后问题

在蓝桥杯基础训练题中,出现这样一道题目: 问题描述 给定一个n*n的棋盘,棋盘中有一些位置不能放皇后.现在要向棋盘中放入n个黑皇后和n个白皇后,使任意的两个黑皇后都不在同一行.同一列或同一条对角线上,任意的两个白皇后都不在同一行.同一列或同一条对角线上.问总共有多少种放法?n小于等于8. 输入格式 输入的第一行为一个整数n,表示棋盘的大小. 接下来n行,每行n个0或1的整数,如果一个整数为1,表示对应的位置可以放皇后,如果一个整数为0,表示对应的位置不可以放皇后. 输出格式 输出一个整数,表示总

8皇后以及N皇后算法探究,回溯算法的JAVA实现,非递归,循环控制及其优化

上两篇博客 8皇后以及N皇后算法探究,回溯算法的JAVA实现,递归方案 8皇后以及N皇后算法探究,回溯算法的JAVA实现,非递归,数据结构“栈”实现 研究了递归方法实现回溯,解决N皇后问题,下面我们来探讨一下非递归方案 实验结果令人还是有些失望,原来非递归方案的性能并不比递归方案性能高 代码如下: package com.newflypig.eightqueen; import java.util.Date; /** * 使用循环控制来实现回溯,解决N皇后 * @author [email pr

回溯算法解八皇后问题(java版)

八皇后问题是学习回溯算法时不得不提的一个问题,用回溯算法解决该问题逻辑比较简单. 下面用java版的回溯算法来解决八皇后问题. 八皇后问题,是一个古老而著名的问题,是回溯算法的典型案例.该问题是国际西洋棋棋手马克斯·贝瑟尔于1848年提出:在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行.同一列或同一斜线上,问有多少种摆法. 思路是按行来规定皇后,第一行放第一个皇后,第二行放第二个,然后通过遍历所有列,来判断下一个皇后能否放在该列.直到所有皇后都放完,或者放哪