八皇后问题

/*
**8皇后问题
**
*/

#include<stdio.h>
#include<stdlib.h>

#define MAXSIZE 8

int gEightQueen[MAXSIZE] = {0};     //数组下标代表行数,数组内存储的数据代表列数
int gCount = 0;                     //记录可行的情况数

void print(){           //输出矩阵'*'出放置皇后,'0'处不放置东西
    int i,j;
    for(i = 0; i < MAXSIZE; i++){
        for(j = 0; j < gEightQueen[i]; j++)
            printf("0 ");
        printf("* ");
        for(j = gEightQueen[i] + 1; j < MAXSIZE; j++)
            printf("0 ");
        printf("\n");
    }
    printf("________________________________\n");
}


bool posVaild(int row, int col){
    int rowIndex, colIndex;
    for(rowIndex = 0; rowIndex < row; rowIndex++){
        colIndex = gEightQueen[rowIndex];
        if(colIndex == col){        //同列
            return 0;
        }
        if((rowIndex - row) == (colIndex - col)){   //对角线   
            return 0;
        }
        if((rowIndex - row) == -(colIndex - col)){  //对角线   
            return 0;
        }
    }
    return 1;
}


void EightQueen(int row){
    int column;
    for(column = 0; column < MAXSIZE; column++){
        if(posVaild(row,column)){       //如果(row,column)可以放置皇后
            gEightQueen[row] = column;  //记录行号为row处放置皇后的列号为column
            if(row == 7){               //行号0-7都已放置完
                ++gCount;               //记录值加一
                print();                //输出棋盘
                gEightQueen[row] = 0;   //把gEightQueen重置为0
                return ;
            }
            EightQueen(row + 1);        //对下一行进行处理
            gEightQueen[row] = 0;       //把gEightQueen重置为0
        }   
    }
}


int main(){

    EightQueen(0);
    printf("total:%d\n",gCount);
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值