皇后问题求解C语言程序设计,回溯法解决N皇后问题(C语言)

#include

#include

//存放皇后节点的队列

int queen[5] = {0}; //line和list的映射

int n =4 ;

int counts = 0;

//跟该行以前的行的皇后作比较看是否可以放置

int checkQueen(int line,int list){

int BeforeLine;

for(BeforeLine = 1; BeforeLine < line; BeforeLine++){

if(queen[BeforeLine] == list) return 0;

else if(line+queen[BeforeLine]== BeforeLine+list || line-queen[BeforeLine]== BeforeLine-list) return 0;

}

return 1;

}

//打印输出结果

void print(){

int line, list;

for(line = 1;line <= n; line++){

for(list = 1; list <= n; list++){

if(queen[line] == list) printf("#");

else printf("0");

}

printf("\n");

}

printf("\n");

printf("*********************************");

printf("\n");

}

void Queen(int line){ //寻找可以放置皇后的该行对应的列

int list;

for(list = 1;list <= n; list++){

//判断该行该列可以放置皇后?

if(checkQueen(line,list)){ //可以放置皇后

queen[line] = list;

if(line == n){ //遍历完了

//解法增加

counts++;

print();

//将数组清空

queen[line] = 0;

return;

}

//递归

Queen(line+1);

//无论找到与否,都将该位置清空,已被再用

queen[line] = 0;

}

}

}

int main(){

//从第一行开始遍历,保证行是逐次增加的,列随之增加就行了

Queen(1);

printf("count = %d\n",counts);

return 0;

}

结果:

24c9d42d6ab37e0b4c065199bcbf9281.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值