zoukankan      html  css  js  c++  java
  • 用c++实现的8皇后问题

    最近弄弄一些经典的算法,八皇后是其一。
    在8*8的棋盘上摆8个皇后,使任2皇后不在同一行、列、对角线上,有几种摆法?
    可以扩展到N皇后。
    #include <iostream>
    #include 
    <string>
    using namespace std;

    #define NUM 8

    char cache[NUM][NUM] = {0};
    void queen(int row, int max)
    {
     
    // 依次放置在列上
     for (int i = 0; i < max; ++i)
     
    {
      
    // 清空当前行
      memset(cache[row], 'x', max);
      
      
    bool fHas = false;
      
    // 判断同一列
      for(int irow = 0; irow < row; ++irow)
      
    {
       
    if(cache[irow][i] == 'o')
       
    {
        fHas 
    = true;
        
    break;
       }


       
    // 对角线是否有皇后
       int icol = i;
       
    if(icol + (row - irow) < max)
       
    {
        
    if(cache[irow][icol + (row - irow)] == 'o')
        
    {
         fHas 
    = true;
         
    break;
        }

       }


       
    if(icol - (row - irow) >= 0)
       
    {
        
    if(cache[irow][icol - (row - irow)] == 'o')
        
    {
         fHas 
    = true;
         
    break;
        }

       }

      }


      
    if(fHas)
       
    continue;

      cache[row][i] 
    = 'o';

      
    if(row < max - 1)
       queen(row 
    + 1, max);

      
    if(row == max - 1)
      
    {
       
    for (int i = 0; i < max; ++i)
       
    {
        
    for (int j = 0; j < max; ++j)
        
    {
         cout
    << cache[i][j]<< " ";
        }


        cout
    << endl;
       }


       cout
    << endl;
      }

     }


    }


    int main(int argc, char* argv[])
    {
     queen(
    0, NUM);
     
    return 0;
    }

  • 相关阅读:
    E. 因数串
    三点共圆公式
    B-Suffix Array
    线段树求解连续区间问题
    E. Quantifier Question (拓扑排序求前驱和后继)
    CF1344B Monopole Magnets
    Multiset (权值线段树模版)
    459. 重复的子字符串 next数组
    6.21笔试小结
    canva学习笔记
  • 原文地址:https://www.cnblogs.com/yoran/p/1084530.html
Copyright © 2011-2022 走看看