八皇后问题C语言解法(递归、回溯)

本算法是经过学习B站UP主讲解后,整理出来的代码,编译无误,可生成92种方式。

#include "stdafx.h" #include"stdlib.h"int place[8] = {0}; //用来记录当前行的皇后在第几列 bool flag[8] = {1,1,1,1,1,1,1,1}; //那一列有皇后占领 bool d1[15] = {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1}; //上对角线是否占领 bool d2[15] = { 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 }; //下对角线是否占领 int number = 0; //技术总共有多少解法void print(int n) { int i,j; int table[8][8]={0}; for(i=0; i<8; i++) table[i][place[i]]=1; printf_s("\n第 %d 种\n",n); for(i=0; i<8; i++) for(j=0; j<8; j++) { printf_s("%d ",table[i][j]); if(j==7)printf_s("\n"); } }void generate(int n) { int col; //当前列 for(col=0; col<8; col++)//八列都需要判断完 { if(flag[col]==1 && d1[n-col+7] == 1 && d2[n+col] == 1)//查看占领状态 { //符合条件即占领 place[n]=col; flag[col] = 0; d1[n - col + 7] = 0; d2[n + col] = 0; if(n<7)//八个皇后全部放置完毕判断 generate(n+1); else { ++number; print(number); } //所有的检查完,再继续回溯,确保得出所有解 flag[col] = 1; d1[n - col + 7] = 1; d2[n + col] = 1; } } }int main() { printf_s("八皇后放法:\n"); generate(0); printf_s("总共有 %d 种八皇后放法\n", number); system("pause"); return 0; }

【八皇后问题C语言解法(递归、回溯)】

    推荐阅读