N皇后

N皇后问题是计算机科学中最为经典的问题之一,该问题可追溯到1848年,由国 际西洋棋棋手马克斯·贝瑟尔于提出了8皇后问题。 将N个皇后放摆放在N*N的棋盘中,互相不可攻击,有多少种摆放方式,每种摆 放方式具体是怎样的?
LeetCode 51. N-Queens

皇后的攻击范围

若在棋盘上已放置一个皇后,它实 际上占据了哪些位置?

以这个皇后为中心,上、下、左、 右、左上、左下、右上、右下,8个方向的位置全部被占据。

思考:
若在棋盘上放置一个皇后,如右图 ,标记为红色位置即不可再放 其他皇后了,如何设计算法与 数据存储,实现这一过程?


方向数组:

static const int dx[]= {-1,1,0,0,-1,-1,1,1}
static const int dy[]= {0,0,-1,1,-1,1,-1,1}

分别表示上,下,左,右,左上,右上,左下,右下。

第X行,y列放置皇后,mark[行][列]表示一张期盼

void put_down_the_queen(int x, int y, std::vector<std::vector<int>> & mark){
    static const int dx[]= {-1,1,0,0,-1,-1,1,1}
    static const int dy[]= {0,0,-1,1,-1,1,-1,1}//方向数组;
}
    mark[x][y] = 1;//(x,y)放置皇后,进行标记
    for(int i = 1; i < mark.size(); i++){ //8个方向,每个方向向外延伸至1至N-1
        for( int j = 0; j < 8; j++){
            int new_x = x + i *dx[j];
            int new_y = y + i *dy[j];
            if(new_x >= 0 && new_x < mark.size() && new_y >= 0 && new_y < mark.size()){
                mark[new_x][new_y] = 1;
            } 
        }
     }
算法设计

N皇后问题,对于N*N的棋盘,每行都要放置1个且只能放置1个皇后。
利用递归对棋盘的每一行放置皇后,放置时,按列顺序寻找可以放置皇后的列 ,若可以放置皇后,将皇后放置该位置,并更新mark标记数组,递归进行下一行的皇后放置;当该次递归结束后,恢复mark数组,并尝试下一个可能放皇后的列。
当递归可以完成N行的N个皇后放置,则将该结果保存并返回。


class Solution{
public:
    std:: vector<std::vector<std::string>> solveNQueens(int n){
    std::vector<std::vector<std::string>> result;//储存最终结果的数组
    std::vector<std::string> location;//存储某个摆放结果,当完成一次递归找到结果后,将location push进result
    std::vector<std::vector<int>> mark;//标记棋盘是否可以放置皇后的数组
    for(int i = 0 ; i < n; i++){
        mark.push_back((std::vector<int>()))//初始化mark
        for(int j = 0;j<n;j++){
            mark[i] = push_back(0);
        }
        location.push_back("");
        location[i].append(n,'.');   
    } 
    generate(0, n, location, result, mark);
    return result;
private:
    void put_down_the_queen(int x, int y, std:: vector<std::vector<int>> &mark){}
}
};

//k 代表完成了几个皇后的位置(正在放置第k)
void generate(int k, int n , std::vector<std::string> & location, std:: vector<std:: vector<std::vector<std:: string>>> & result, std:: vector<std::vector<int>> &mark){
    if(k == n ){// 当k==n时,代表完成了第0至n-1行
      result.push_back(location);//皇后的放置,所有皇后完成放置后,将记录皇后位置的location数组push进入result
      return ; 
    }
    for( int i = 0; i < n; i++){//按顺序尝试第0-n-1列
        if(mark[k][i] == 0){// 如果mark[k][i] ==0,即可以放置皇后
            std::vector<std::vector<int>> tmp_mark = mark;//记录回溯mark镜像
            location[k][i] = 'Q';// 记录当前皇后的位置
            put_down_the_queen(khi,mark);//放置皇后
            generate(k+1,n,location,result,mark);//递归下一行皇后放置
            mark == tmp_mark;//将mark重新赋值为回溯前状态
            location =='.';
           
        }
    }
    
}
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,445评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,889评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,047评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,760评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,745评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,638评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,011评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,669评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,923评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,655评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,740评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,406评论 4 320
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,995评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,961评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,197评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,023评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,483评论 2 342

推荐阅读更多精彩内容

  • 问题描述 n皇后问题是将n个皇后放置在n*n的棋盘上,皇后彼此之间不能相互攻击(不同行,不同列,不同对角线)。给定...
    Alfie20阅读 610评论 0 0
  • Source Description 在N*N的方格棋盘放置了N个皇后,使得它们不相互攻击(即任意2个皇后不允许处...
    Gitfan阅读 570评论 0 1
  • N皇后问题 以八皇后为例,在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,皇后可以在其所在位置的对应的行,列...
    Yihulee阅读 2,339评论 0 2
  • 漂亮拖鞋阅读 413评论 2 8
  • 文/鹿田小静 1. 30而立,每个人都有对自己人生美好愿景的期待,这个阶段,尚有体力,工作稳定,事业有成。结婚生子...
    鹿田阅读 537评论 3 8