1. 程式人生 > >HDU2553 N皇后問題【回溯法】

HDU2553 N皇后問題【回溯法】

N皇后問題 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 9579    Accepted Submission(s): 4314
Problem Description
在N*N的方格棋盤放置了N個皇后,使得它們不相互攻擊(即任意2個皇后不允許處在同一排,同一列,也不允許處在與棋盤邊框成45角的斜線上。
你的任務是,對於給定的N,求出有多少種合法的放置方法。

Input
共有若干行,每行一個正整數N≤10,表示棋盤和皇后的數量;如果N=0,表示結束。
 
Output
共有若干行,每行一個正整數,表示對應輸入行的皇后的不同放置數量。
 
Sample Input
1
8
5
0
 
Sample Output
1
92

10

題目大意:N*N的棋盤上放N個皇后,N個皇后不能出現在同一行,同一列或是同一斜行。

思路:直接列舉判斷太慢了,考慮到每行每列只有一個皇后,那麼用一個數組C[x]表示第

x行放置的皇后所在的列編號,即x表示行,C[x]表示列。判斷是否和前邊所放皇后衝突可以

判斷當前第cur行與之前的0~j行是否衝突。

C[cur] == C[j] || cur-C[cur] == j-C[j] || cur+C[cur] == j+C[j]分別判斷是否在同一列,同一

主對角線,同一副對角線上。

但是還可以繼續優化。直接用一個vis[3][?]直接判斷當前嘗試的皇后所在列和對角線是否已

有其他皇后,即 !vis[0][i]所在列是否有其他皇后,!vis[1][cur+i]所在副對角線是否有其他皇

後,!vis[2][cur-i+n]所在副對角線上是否有其他皇后。

但是這樣提交的程式碼也超時了。。。

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
using namespace std;

int vis[3][50],C[30],tot,N;
void Search(int cur)
{
    if(cur == N)
    {
        tot++;
    }
    else
    {
        for(int i = 0; i < N; i++)
        {
            if(!vis[0][i] && !vis[1][cur+i] && !vis[2][cur-i+N])
            {
                vis[0][i] = vis[1][cur+i] = vis[2][cur-i+N] = 1;
                Search(cur+1);
                vis[0][i] = vis[1][cur+i] = vis[2][cur-i+N] = 0;
            }

        }
    }

}
int main()
{
    while(~scanf("%d",&N) && N)
    {
        tot = 0;
        memset(vis,0,sizeof(vis));
        Search(0);
        printf("%d\n",tot);
    }

    return 0;
}

果斷打表過
#include<iostream>
using namespace std;

int main()
{
    int a[23] = {0,1,0,0,2,10,4,40,92,352,724};
    int N;
    while(cin >> N)
    {
        if(N==0)
            break;
        else
            cout << a[N] << endl;
    }
}


相關推薦

HDU2553 N皇后問題回溯

N皇后問題 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total S

回溯八皇後問題(遞歸和非遞歸)

問題 一個 bce and 核心 皇後 條件 IE 上一個 先貼代碼,分遞歸回溯法和非遞歸回溯法 遞歸回溯法,代碼如下: // test.cpp : Defines the entry point for the console application. // #inc

學習之回溯--迷宮問題

map print 檢測 tle 要求 -i result color n) 題目描述 定義一個二維數組N*M(其中2<=N<=10;2<=M<=10),如5 × 5數組下所示: int maze[5][5] = { 0, 1, 0

第五章回溯最大團問題和圖的m著色問題

原文:http://blog.csdn.net/liufeng_king/article/details/8781554 1、最大團問題      問題描述      給定無向圖G=(V, E),其中V是非

N皇后問題----回溯

問題描述: 將n個皇后放置在n * n的棋盤上,使得任意兩個皇后不能相互攻擊。即任意兩個皇后都不在同一行,同一列,和同一條斜角線上。 問題分析: 1. 回溯法 回溯法的思想和基本概念在這裡就不再詳細闡述,想要深入瞭解的朋友可以自行查詢相關資料,在這裡我只簡單說

n皇后問題回溯---java圖形介面實現回溯過程

/*<span style="white-space:pre"> </span>by wbin 2015/12/18實現n皇后問題的回溯法過程,以java圖形介面展示,程式碼寫得略醜,見諒.*/import java.awt.Color; impo

N皇后問題 回溯

回溯法過程 在試探過程中,皇后的放置需要檢查她的位置是否和已經放置好的皇后發生衝突,因此需要一個檢查函式 假如兩個皇后被放置在(i,j)和(k,l)上 ,當且僅當 |i-k|==|j-l| 時

0031演算法筆記——回溯旅行員售貨問題和圓排列問題

     1、旅行員售貨問題 問題描述 某售貨員要到若干城市去推銷商品,已知各城市之間的路程(旅費),他要選定一條從駐地出發,經過每個城市一遍,最後回到駐地的路線,使總的路程(總旅費)最小。     問題分析 旅行售貨員問題的解空間是一棵排列樹。對於排列樹的回溯法與生成

N皇后問題--回溯

1.引子    中國有一句古話,叫做“不撞南牆不回頭",生動的說明了一個人的固執,有點貶義,但是在軟體程式設計中,這種思路確是一種解決問題最簡單的演算法,它通過一種類似於蠻幹的思路,一步一步地往前走,每走一步都更靠近目標結果一些,直到遇到障礙物,我們才考慮往回走。然後再繼續嘗

回溯0-1揹包

0-1揹包問題:給定的n種物品和一揹包。物品i的重量是Wi,其價值是Vi,揹包的容量為C。問應該如何選擇裝入揹包的物品,使得裝入揹包中物品的總價值最大? 【解題思路】 對於物品來說只有兩種狀態,放或者

HDU2553 N皇后問題(回溯

此題是經典的N皇后問題,描述:在一個N*N的棋盤上要擺放N個皇后,要求任意兩個皇后不能在同一行,同一列或者同一條與棋盤的邊成45度角的斜線上,即與對角線平行的斜線上,求對於不同的N,各有多少種擺法使任意兩個皇后不能相互攻擊。 用回溯法就可以解決,設皇后的編號依次為1,2,

hdu2553 n皇后問題(純粹回溯)

#include <iostream> #include <string> #include <stdio.h> #include <algorithm> #include <math.h> //n皇后問題用一維陣列

UVA 524 素數環 dfs/回溯

prim output %d set class script int 素數環 ogr Description A ring is composed of n (even number) circles as shown in diagram. Put natu

NOJ1007演算法實驗二回溯演算法皇后問題

1007.8皇后問題 時限:1000ms 記憶體限制:10000K  總時限:3000ms 描述 輸出8皇后問題所有結果。 輸入 沒有輸入。 輸出 每個結果第一行是No n:的形式,n表示輸出的是第幾個結果; 下面8行,每行8個字元,‘A’表示皇后,‘

OpenJudge 2.5-1700 八皇后問題回溯演算法

Description 在國際象棋棋盤上放置八個皇后,要求每兩個皇后之間不能直接吃掉對方。 Input 無輸入。 Output 按給定順序和格式輸出所有八皇后問題的解(見Sample Output)。 Sample Input Sample Output No. 1

695. Max Area of Island回溯 + 圖的遍歷

題目 Given a non-empty 2D array grid of 0's and 1's, an island is a group of 1's (representing land) connected 4-directionally (horizont

hdu2553 N皇后問題(回溯dfs)

剛開始怎麼也想不通怎麼斜向判斷,看了詳解,服了。。戳這裡N皇后詳解 準確的說他是用了滾動陣列,分別用三行記錄正對角線,縱向,反對角線方向所放置過皇后所能影響的狀態記錄。若在攻擊範圍內,則標記1。而且

HDU1395 ZOJ1489 2^x mod n = 1暴力+數論

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 17824    Accepted Submission(s

小知識

count 要求 字符 出現 存在 方法 最終 while 意思   記錄一些在我看來有意思的小算法知識 ■  識別有效的括號字符串   以小括號為例,在帶括號的字符串中,如果只提取出括號作為特征,"()",""(空串),"(()(()(())))"這些是有效的括號字符

和數據結構緒論

title 避免 找到 高端 分析 初學 閱讀 相關 結構 算法和算法分析   先說點無關緊要的。初中的時候,知道有CS這門專門的學科存在的時候最開始的概念中CS就是等同於算法。這有可能是因為當時的前桌是後來一代CS傳奇WJMZBMR。。因為當時看起來十分高端,再加上後來