八皇后(c/python)

博客探讨了八皇后问题的解决方案,分别使用C语言和Python进行编程实现。通过两个不同的方法解决,确保在8x8棋盘上放置的八个皇后互不处于同一行、列或对角线。文章提供了详细的C代码和Python代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

八皇后: 在8 * 8 的棋盘上,八个皇后两两不在同行,同列或者斜对角上

解法1: 用三个数组分别代表同栏,主斜对角,副斜对角(具体如下面的C代码)

解法2: 用C[i]=j表示第i行第j列放置皇后,则当第r行 C[r]!=C[i]表示不在同一列,当abs(r-i)!=abs(C[r]-C[i])时,表示不在同意斜线上(如下python代码)

C代码

#include<stdio.h>
#include<stdlib.h>
#define N 8

int column[N + 1];  //同栏是否有皇后 1表示有
int rup[2 * N + 1]; //右上至左下是否有皇后(斜对角) 1表示有
int lup[2 * N + 1];  //左上至右下是否有皇后 (斜对角)  1表示有
int Q[N + 1];  //每行皇后放置的位置
int num = 1;//记录皇后放置方法数目
void traceback(int i);
int main()
{
    int i, j;
    //初始化 表示每个位置都可以放置
    for (i = 1; i <= N; i++)
        column[i] = 1;
    for (j = 1; j <= 2 * N; j++)
        rup[j] = lup[j] = 1;

    traceback(1);
    system("pause");
}

void showAnswer()
{

    printf("num:%d\n", num++);
    for (int x = 1; x <= N; x++)
    {
        for (int y = 1; y <= N; y++)
        {
            if (Q[x] == y)
                printf("Q");
            else
                printf(".");
        }
        printf("\n");
    }

}
void traceback(int i)
{
    if (i > N)
    {   
        showAnswer();
    }
    else
    {
        for (int j = 1; j <= N; j++)
        {
            if (column[j] == 1 && rup[i + j] == 1 && lup[i - j + N] == 1)
            {
                Q[i] = j;  //第i行的皇后放置在j位置
                column[j] = rup[i + j] = lup[i - j + N]= 0;  // (i,j)所在的栏,斜对角占用,即不能再放置皇后
                traceback(i + 1);
                column[j] = rup[i + j] = lup[i - j + N]= 1;  //解除占用
            }
        }
    }
}

python代码

# -*- coding: utf-8 -*-
"""
Created on Sat Nov  4 20:22:59 2017

@author: yangwenbin
"""
import numpy as np 
C=np.zeros(8)
num=1
def print_map():
    global num
    print("num%d\n:"%num)
    num+=1
    for i in range(8):
        for j in range(8):
            if j==C[i]:
                print("Q",end=' ')
                pass
            else:
                print(".",end=' ')
                pass
            pass
        print("\n")
        pass
    pass

def backSearch(cur):
    if cur ==  len(C):
        print_map()
        pass
    else:
        for col in range(len(C)):
            C[cur],flag=col,1
            for row in range(cur): #判断下个皇后的位置与已经放置的皇后是否冲突
                if col==C[row] or abs(row-cur)==abs(C[row]-col):
                    flag=0
            if flag:
                backSearch(cur+1)
backSearch(0)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值