zoukankan      html  css  js  c++  java
  • N皇后问题

    N皇后问题

    经典的回溯算法

    
    // 判断当前棋子位置是否符合规则,是则返回1,否则返回0
    // j:第j行,p[j]:当前q的位置
    int judge(vector<int> &p, int j) {
         for (int i = 0; i < j; ++i) {
              if (p[j] == p[i]) //第i行第j行的q在同一列
                   return 0;
              if (abs(p[j] - p[i]) == j - i)//第i行第j行的q在斜对角线,列-列=行-行
                   return 0;
              }
         return 1;
    }
    
    vector<vector<string> >  NQueens(int n){
         vector<vector<string> > res;
         if (n == 1){
              res = { { "Q" } };
              return res;
         }
    
         vector<int> aa(n, 0);//一维表aa,aa[i]表示第i行的皇后放在这一行的哪个位置
    
         for (aa[0] = 0; aa[0] < n; ++aa[0]){
             int for_begin = 0;
             int j = 1; //代表行数,从第一行开始
             while (1){
                 int flag = 0;
                 for (aa[j] = for_begin; aa[j] < n; ++aa[j]){
                     if (judge(aa, j)){//如果存在可行的位置
                         ++j;
                         flag = 1;
                         for_begin = 0;
                         break;
                    }
                }
                if (flag == 0){//flag==0 行j没有可行的位置,则回溯
                    --j;
                    for_begin = aa[j] + 1;//从上次放置的位置的下一个开始
                }
                if (j == n){ //最后一行
                    int m, nn;
                    vector<string> re;
                    for (m = 0; m < n; m++){
                        string r = "";
                        for (nn = 0; nn < n; nn++){
                            if (nn == aa[m]){
                                r += "Q";
                            }else{
                                r += ".";
                            }
                        }
                        re.push_back(r);
                    }
                    res.push_back(re);
                    j = j - 2;//?
                    for_begin = aa[j] + 1;
                }
                if (j == 0) break;
            }
        }
        return res;
    }
    
  • 相关阅读:
    git取消文件跟踪
    servlet
    查杀端口进程
    初始化git仓库,并push到远端
    tomcat
    bootstrap
    idea中web工程错误
    i++和++i
    js算法
    编程工具
  • 原文地址:https://www.cnblogs.com/iois/p/4580153.html
Copyright © 2011-2022 走看看