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;
}
posted @ 2015-06-16 10:44  clq.lib  阅读(202)  评论(0编辑  收藏  举报