皇后问题求解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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
n皇后问题是经典的回溯算法问题,其解法可以用C语言实现。下面是一个简单的C语言实现: ```c #include <stdio.h> #define MAX_N 20 int n; // 皇后个数 int map[MAX_N][MAX_N]; // 记录棋盘状态 int count = 0; // 记录解的个数 // 输出结果 void print_result() { printf("Solution %d:\n", count); for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { printf("%c ", map[i][j] == 1 ? 'Q' : '.'); } printf("\n"); } printf("\n"); } // 检查位置是否合法 int check_pos(int row, int col) { for (int i = 0; i < row; i++) { if (map[i][col] == 1) // 检查同一列 return 0; if (col-i-1 >= 0 && map[row-i-1][col-i-1] == 1) // 检查左上角 return 0; if (col+i+1 < n && map[row-i-1][col+i+1] == 1) // 检查右上角 return 0; } return 1; } // 回溯求解 void backtrack(int row) { if (row >= n) { count++; print_result(); return; } for (int i = 0; i < n; i++) { if (check_pos(row, i)) { map[row][i] = 1; backtrack(row+1); map[row][i] = 0; } } } int main() { printf("Input the number of queens: "); scanf("%d", &n); backtrack(0); printf("Total solutions: %d\n", count); return 0; } ``` 在这个实现中,我们使用一个二维数组 `map` 记录棋盘状态,其中 `map[i][j]` 表示第 i 行第 j 列是否放置了皇后。`check_pos` 函数用于检查当前位置是否合法,如果不合法则返回 0,否则返回 1。在 `backtrack` 函数中,我们对每一行依次遍历棋盘的每一列,如果当前位置合法,则在该位置放置皇后,并递归处理下一行。如果最后一行也放置了皇后,则输出结果。在回溯时需要将当前位置重新置为 0。 该实现可以在输入皇后个数后输出所有的解,并统计解的总个数。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值