当前位置:   article > 正文

问题 D: 【递归入门】n皇后 问题(原始的8皇后问题)_n 皇后问题(输出皇后列号)

n 皇后问题(输出皇后列号)

题目描述

       会下国际象棋的人都很清楚:皇后可以在横、竖、斜线上不限步数地吃掉其他棋子。如何将8个皇后放在棋盘上(有8 * 8个方格),使它们谁也不能被吃掉!这就是著名的八皇后问题。

 

输入

一个整数n( 1 < = n < = 10 ) 

输出

每行输出对应一种方案,按字典序输出所有方案。每种方案顺序输出皇后所在的列号,相邻两数之间用空格隔开。如果一组可行方案都没有,输出“no solute!”

样例输入 Copy

4

样例输出 Copy

2 4 1 3
3 1 4 2

思路:基于全排列的思想来做。不过在生成完p数组再去判断效率太低, 可以在边生成p的时候边判断,后面在优化吧= -。 

  1. #include <iostream>
  2. #include <bits/stdc++.h>
  3. using namespace std;
  4. int p[15], hashtable[15] = {0}, n, flag1 = 0;//flag1 标记存不存在方案
  5. void dfs(int index) {
  6. if(index == n+1) {
  7. int flag = 1;
  8. for(int i = 1; i <= n; i++) {
  9. for(int j = i + 1; j <= n; j++) {
  10. if(abs(i - j) == abs(p[i] - p[j])) {
  11. flag = 0;
  12. break;
  13. }
  14. }
  15. if(!flag) break;
  16. }
  17. if(flag) {
  18. printf("%d", p[1]);
  19. for(int i = 2; i <= n; i++) {
  20. printf(" %d", p[i]);
  21. }
  22. printf("\n");
  23. flag1 = 1;
  24. }
  25. return;
  26. }
  27. for(int x = 1; x <= n; x++){
  28. if(hashtable[x] == 0){
  29. p[index] = x;
  30. hashtable[x] = 1;
  31. dfs(index + 1);
  32. hashtable[x] = 0;
  33. }
  34. }
  35. }
  36. int main(int argc, char** argv) {
  37. while(cin >> n) {
  38. dfs(1);
  39. if(!flag1){//如果不存在方案
  40. printf("no solute!\n");
  41. }
  42. }
  43. return 0;
  44. }

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/盐析白兔/article/detail/825502
推荐阅读
相关标签
  

闽ICP备14008679号