1. 程式人生 > >經典DFS之N皇后問題

經典DFS之N皇后問題

N皇后問題

題目

Time Limit:1000MS Memory Limit:32768KB

  • Description

在N*N的方格棋盤放置了N個皇后,使得它們不相互攻擊(即任意2個皇后不允許處在同一排,同一列,也不允許處在與棋盤邊框成45角的斜線上。
你的任務是,對於給定的N,求出有多少種合法的放置方法。

  • Input

共有若干行,每行一個正整數N≤10,表示棋盤和皇后的數量;如果N=0,表示結束。

  • Output

共有若干行,每行一個正整數,表示對應輸入行的皇后的不同放置數量。

  • Sample Input

1
8
5
0

  • Sample Output

1
92
10

分析

本題是DFS中的經典問題,在暴力深搜的基礎上採用了回溯法,值得注意的是對資料的處理問題,因為只有10個數,實際AC的過程中只需要將10個N值對應的方案數算一遍儲存起來,避免了重複計算。
以下是問題解決的示例程式碼。

程式碼

#include <cstring>
#include <cstdio>

int num;
int a[15];

void trial(int i, int n)
{
    if(i == n){
        num++;
        return;}
    else{
        for
(int m=0;m<n;m++){ int ok = 1; a[i] = m; for(int j=0;j<i;j++) if(a[i]==a[j]||i-a[i]==j-a[j]||i+a[i]==j+a[j]) { ok = 0; break; } if(ok) trial(i+1,n); } } } int
main() { int N; while(scanf("%d",&N) == 1 && N!=0) { num = 0; memset(a,0,sizeof(a)); trial(0, N); printf("%d\n",num); } return 0; }

問題背景補充

八皇后問題是一個以國際象棋為背景的問題:如何能夠在 8×8 的國際象棋棋盤上放置八個皇后,使得任何一個皇后都無法直接吃掉其他的皇后?為了達到此目的,任兩個皇后都不能處於同一條橫行、縱行或斜線上。八皇后問題可以推廣為更一般的n皇后擺放問題:這時棋盤的大小變為n×n,而皇后個數也變成n。當且僅當 n = 1 或 n ≥ 4 時問題有解。
八皇后問題最早是由國際西洋棋棋手馬克斯·貝瑟爾於1848年提出。之後陸續有數學家對其進行研究,其中包括高斯和康託,並且將其推廣為更一般的n皇后擺放問題。八皇后問題的第一個解是在1850年由弗朗茲·諾克給出的。諾克也是首先將問題推廣到更一般的n皇后擺放問題的人之一。1874年,S.岡德爾提出了一個通過行列式來求解的方法,這個方法後來又被J.W.L.格萊舍加以改進。
艾茲格·迪傑斯特拉在1972年用這個問題為例來說明他所謂結構性程式設計的能力。
八皇后問題出現在1990年代初期的著名電子遊戲第七訪客中。

相關推薦

經典DFSN皇后問題

N皇后問題 題目 Time Limit:1000MS Memory Limit:32768KB Description 在N*N的方格棋盤放置了N個皇后,使得它們不相互攻擊(即任意2個皇后不允許處在同一排,同一列,也不允許處在與棋

經典回溯演算法n皇后問題

這是來源於國際象棋的一個問題。n皇后問題要求在一個n×n格的棋盤上放置n個皇后,使得它們彼此不受攻擊。按照國際象棋的規則,一個皇后可以攻擊與之處在同一行或同一列或同一條斜線上的其他任何棋子。因此,n後問題等價於要求在一個n×n格的棋盤上放置n個皇后,使得任何兩個皇后不能被放

回溯N皇后問題

回溯演算法思想:為了求得問題的解,先選擇某一種可能情況進行試探,在試探過程中,一旦發現原來的選擇的假設情況是錯誤的,就退回一部重新選擇,繼續向前試探,如此反覆進行,直至得到解或證明無解。 如何能夠在N X N的國際象棋棋盤上放置N個皇后,使得任何一個皇后都無法直接吃掉其他的皇后? 為了達到此

演算法n皇后問題

1. 問題描述:在n×n的棋盤上放置彼此不受攻擊的n個皇后。按照國際象棋的規則,皇后可以攻擊與之處在同一行或同一列或同一斜線上的棋子。n皇后問題等價於在n×n的棋盤上放置n個皇后,任何2個皇后不能放在同一行或同一列或同一斜線上。 2. 問題分析: 用n元陣列x[n]表示

【C/C++】回溯經典演算法-->八皇后問題

一、八皇后問題 八皇后問題,是一個古老而著名的問題,是回溯演算法的典型案例。該問題是國際西洋棋棋手馬克斯·貝瑟爾於1848年提出:在8×8格的國際象棋上擺放八個皇后,使其不能互相攻擊,即任意兩個皇后都不能處於同一行、同一列或同一斜線上,問有多少種擺法。高斯認為有76種方案。

N皇后問題(DFSN皇后問題

<span style="font-size:14px;"><span style="font-size:14px;">#include<cstdio> #include<cstdlib> using namespace std; int n,m,temp; i

回溯經典演算法皇后問題

1.問題概述:在一個4*4的方格中住著四個皇后,他們之間都不友好,相鄰就會打架,現在要進行查詢能夠滿足:每行每列每個斜線都只有一個皇后,才能沒有打架發生 2.思路: 這裡需要這樣進行查詢,第一個

華為OJN皇后問題(C++程式碼)

1問題描述 N皇后問題,就是如何將國際象棋中的N個皇后放在N*N的棋盤上而不會互相攻擊,是一種通過列舉,再遞迴、回溯的思想。 2思路 以8皇后問題為例,可知在8*8二維陣列中,每個點用data[i][j]表示(0 <= i,j <= 7)。

DFSN皇后問題

侵刪。 #include <stdio.h> #include <string.h> int map[20][20],cnt; int ans[20] = {0},num,n; void dfs(int x,int y)

leetcode刷題——N皇后

題目: n 皇后問題研究的是如何將 n 個皇后放置在 n×n 的棋盤上,並且使皇后彼此之間不能相互攻擊。 上圖為 8 皇后問題的一種解法。 給定一個整數 n,返回所有不同的 n 皇后問題的解決方案。 每一種解法包含一個明確的 n 皇后問題的棋子放置方案,該方案中 

DFS解決n皇后問題

問題描述 在nxn格的棋盤上放置彼此不受攻擊的n個皇后。按照國際象棋的規則,皇后可以攻擊與之處在同一行或同一列或同一斜線上的棋子。n皇后問題等價於在nxn格的棋盤上放置n個皇后,任何2個皇后不放在同一行或同一類或同一斜線上。 演算法設計 用n元組x[1:n]表示n皇后問題的

遞歸回溯問題的四道經典題:N皇后,組合,全排列,二叉樹路徑和

組合和排列問題的實質是對N叉樹的遍歷,只是退出條件不同。 1.組合 描述:給出兩個整數n和k,返回從1……n中選出的k個數的組合。 樣例: 例如 n = 4 且 k = 2 返回的解為: [[2,4],[3,4],[2,3],[1,2],[1,3

n皇后問題(dfs練習)hdu2553

題目: Problem Description 在N*N的方格棋盤放置了N個皇后,使得它們不相互攻擊(即任意2個皇后不允許處在同一排,同一列,也不允許處在與棋盤邊框成45角的斜線上。 你的任務是,對於給定的N,求出有多少種合法的放置方法。 Input 共有若干行,每行一個正整數N≤10,

深度優先搜尋dfs1到n的全排列(收藏)

/******** *給你一個數n,輸出1到n的全排列 *深度優先搜尋 ********/#include <stdio.h>#include <stdlib.h>int book[10], a[10], n;  void dfs(int step) 

hdu2553 N皇后問題--DFS

一:原題內容 Problem Description 在N*N的方格棋盤放置了N個皇后,使得它們不相互攻擊(即任意2個皇后不允許處在同一排,同一列,也不允許處在與棋盤邊框成45角的斜線上。

hdu2553 n皇后問題 dfs搜尋 記憶化

N皇后問題 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 21710    Accepted Submis

HDU2553:N皇后問題(DFS)

Problem Description 在N*N的方格棋盤放置了N個皇后,使得它們不相互攻擊(即任意2個皇后不允許處在同一排,同一列,也不允許處在與棋盤邊框成45角的斜線上。 你的任務是,對於給定的N

dfs經典】P1219 八皇后問題

題目描述 檢查一個如下的6 x 6的跳棋棋盤,有六個棋子被放置在棋盤上,使得每行、每列有且只有一個,每條對角線(包括兩條主對角線的所有平行線)上至多有一個棋子。 上面的佈局可以用序列2 4 6 1 3 5來描述,第i個數字表示在第i行的相應位置有一個棋子,如下: 行

dfs n皇后問題

#include<stdio.h> #include<string.h> #include<math.h> #include<stdlib.h> #include<algorithm> #include<iostream> #includ