首页 > 学院 > 开发设计 > 正文

n皇后问题

2019-11-08 02:23:43
字体:
来源:转载
供稿:网友
八皇后位置,利用回溯法解决

直接利用回溯法:

#include <stdio.h>int n, tot = 0;int C[1000] = {0};void search(int cur){    if(cur == n){               //边界        tot++;    } else {        for(int i = 0; i < n; i++){            int ok = 1;            C[cur] = i;              //尝试把第cur行的皇后放在第i位            for(int j = 0; j < cur; j++){   //检验是否有冲突                if(C[cur] == C[j] || cur - C[cur] == j - C[j] || cur + C[cur] == j + C[j]){                    ok = 0;                    break;                }            }            if(ok) search(cur + 1);   //放在这个位置可以        }    }}int main(){    scanf("%d", &n);    search(0);    PRintf("%d/n", tot);    return 0;}

将每一种结果输出:

 #include <stdio.h>int n, tot = 0;int C[1000];void show(int cur){    if(cur == n){        tot++;        for(int i = 0; i < n; i++){            for(int j = 0; j < n; j++){                if(j == C[i]){                    printf("h ");                } else {                    printf("+ ");                }            }            printf("/n");        }        printf("/n/n");    } else {        for(int i = 0; i < n; i++){            int ok = 1;            C[cur] = i;            for(int j = 0; j < cur; j++){                if(C[cur] == C[j] || cur - C[cur] == j - C[j] || cur + C[cur] == j + C[j]){                    ok = 0;                    break;                }            }            if(ok) show(cur + 1);        }    }}int main(){    scanf("%d", &n);    show(0);    printf("%d", tot);    return 0;}


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表