1. 程式人生 > >基礎練習 2n皇后問題 ——回溯法,貪心演算法

基礎練習 2n皇后問題 ——回溯法,貪心演算法

/*
基礎練習 2n皇后問題
問題描述
  給定一個n*n的棋盤,棋盤中有一些位置不能放皇后。現在要向棋盤中放入n個黑皇后
和n個白皇后,使任意的兩個黑皇后都不在同一行、同一列或同一條對角線上,任意的兩
個白皇后都不在同一行、同一列或同一條對角線上。問總共有多少种放法?n小於等於8。
輸入格式
  輸入的第一行為一個整數n,表示棋盤的大小。
  接下來n行,每行n個0或1的整數,如果一個整數為1,表示對應的位置可以放皇后,
如果一個整數為0,表示對應的位置不可以放皇后。
輸出格式
  輸出一個整數,表示總共有多少种放法。
樣例輸入
4
1 1 1 1
1 1 1 1
1 1 1 1
1 1 1 1
樣例輸出
2
樣例輸入
4
1 0 1 1
1 1 1 1
1 1 1 1
1 1 1 1
樣例輸出
0
*/
#include<stdio.h>
int tongji(int  , int  , int [][8] , int ,int *);
int check(int , int  ,int ,int [][8] , int );
void shuru( int , int [][8]);


int main(void)
{
    int n ,sz[8][8];
    scanf("%d",&n);
    shuru( n , sz );
    int sum=0;
    printf("%d",tongji(n , 0 , sz , 2  ,&sum));
    return 0;
}
int tongji(int n , int x , int sz[][8] , int s ,int *sum)
{
    
    if( x == n )
    {
        if( s == 2 )
{
tongji(n , 0, sz, 3 , sum );
}
        else 
{
++ *sum ;
}
        return 0;
    }
    int i ;
    for(i = 0 ; i < n ; i ++)
    {
        if(sz[x][i] != 1)
{
continue;
}
        if(check(n , x , i , sz , s ))
{
sz[x][i]=s;
}
        else 
{
continue;
}
        tongji(n , x+1 , sz , s ,sum );
        sz[x][i]=1;
    }
    return * sum;

int check(int  n , int x ,int y ,int sz[][8] , int s)
{
    int i , j;
    for( i = x-1 ; i >= 0 ; i --)
    {
        if(sz[i][y] == s)
{
return 0;
}
    }
    for(i=x-1,j = y-1 ; i >= 0 && j >= 0; i -- , j --)
    {
        if(sz[i][j] == s)
{
return 0;
}
    }
    for(i = x-1,j = y+1;i >= 0 && j < n ; i -- , j ++)
    {
        if( sz[i][j]== s)
        {
        return 0;
}
    }
    return 1;
}
void shuru( int  n , int sz[][8])
{
int i , j ;
for( i = 0 ; i < n ; i ++)
    {
        for( j = 0 ; j < n ; j ++)
        {
            scanf("%d",&sz[i][j]);
        }
    }
}

相關推薦

基礎練習 2n皇后問題 ——回溯貪心演算法

/*基礎練習 2n皇后問題問題描述  給定一個n*n的棋盤,棋盤中有一些位置不能放皇后。現在要向棋盤中放入n個黑皇后和n個白皇后,使任意的兩個黑皇后都不在同一行、同一列或同一條對角線上,任意的兩個白皇后都不在同一行、同一列或同一條對角線上。問總共有多少种放法?n小於等於8。輸

藍橋杯 基礎練習 2n皇后問題【DFS + 回溯

時間限制:1.0s 記憶體限制:512.0MB 問題描述   給定一個n*n的棋盤,棋盤中有一些位置不能放皇后。現在要向棋盤中放入n個黑皇后和n個白皇后,使任意的兩個黑皇后都不在同一行、同一列或同一條對角線上,任意的兩個白皇后都不在同一行、同一列或同

[Java] 藍橋杯BASIC-27 基礎練習 2n皇后問題

問題描述給定一個n*n的棋盤,棋盤中有一些位置不能放皇后。現在要向棋盤中放入n個黑皇后和n個白皇后,使任意的兩個黑皇后都不在同一行、同一列或同一條對角線上,任意的兩個白皇后都不在同一行、同一列或同一條對

資料結構與演算法- 五大常用演算法總結(分治法回溯分治限界貪心演算法動態規劃法)

1.分治法(Recurrence and Divide-Conquer)        對於一個規模為n的問題,若該問題可以容易解決(比如說規模n較小)則直接解決,否則將其分解為k個規模較小的子問題,這些子問題互相獨立且與原問題形式相同,遞迴地解決這些子問

藍橋杯 VIP 基礎練習 2n皇后問題

基礎練習 2n皇后問題   時間限制:1.0s   記憶體限制:512.0MB 問題描述   給定一個n*n的棋盤,棋盤中有一些位置不能放皇后。現在要向棋盤中放入n個黑皇后和n個白皇后,使任意的兩個黑皇后都不在同一行、同一列或同一條對角線上,任意的兩個白皇

基礎練習 2n皇后問題 (兩次DFS)

問題描述   給定一個n*n的棋盤,棋盤中有一些位置不能放皇后。現在要向棋盤中放入n個黑皇后和n個白皇后,使任意的兩個黑皇后都不在同一行、同一列或同一條對角線上,任意的兩個白皇后都不在同一行、同一列或同一條對角線上。問總共有多少种放法?n小於等於8。 輸入格式   輸入的第一行為一個整數n,表示棋盤

(藍橋杯)基礎練習 2n皇后問題

我們先學習下經典案例中的八皇后問題接著學習2n皇后問題問題描述  給定一個n*n的棋盤,棋盤中有一些位置不能放皇后。現在要向棋盤中放入n個黑皇后和n個白皇后,使任意的兩個黑皇后都不在同一行、同一列或同一條對角線上,任意的兩個白皇后都不在同一行、同一列或同一條對角線上。問總共有

五大常用演算法——分治法動態規劃回溯分支界限貪心演算法

分治演算法 一、基本概念    在電腦科學中,分治法是一種很重要的演算法。字面上的解釋是“分而治之”,就是把一個複雜的問題分成兩個或更多的相同或相似的子問題,再把子問題分成更小的子問題……直到最後子問題可以簡單的直接求解,原問題的解即子問題的解的合併。這個技巧是很多高效

基礎練習 2n皇后問題 dfs

問題描述   給定一個n*n的棋盤,棋盤中有一些位置不能放皇后。現在要向棋盤中放入n個黑皇后和n個白皇后,使任意的兩個黑皇后都不在同一行、同一列或同一條對角線上,任意的兩個白皇后都不在同一行、同一列或同一條對角線上。問總共有多少种放法?n小於等於8。 輸入格式  

01揹包的四種解法詳解:動態規劃貪心回溯優先佇列式分支限界(C語言編寫)

最近剛完成了演算法課程設計,題目是用多種解法解決01揹包問題,經過一番探索,終於成功的用四種方法完成了本次實驗,下面記錄分享一下成果: 首先解釋下什麼是01揹包問題:給定一組共n個物品,每種物品都有自己的重量wi, i=1~n和價值vi, i=1~n,在限定的總重量(揹包的

8皇后-----回溯C++程式設計練習

/* * 八皇后問題回溯法程式設計練習 * 在8×8的棋盤上,放置8個皇后,兩個皇后之間不能兩兩攻擊 * 也即,直線,垂直45度、135度方向不能出現兩個皇后 * * copyright Michael 2014-12-19 * QQ 1192065414 *

分治法動態規劃法貪心回溯分支限界的區別和聯絡以及適用情況

    筆者這學期的《演算法設計與分析》課程已經進入尾聲,在這裡對學過的演算法進行總結歸納。筆者先對各個演算法的思想進行簡單的陳述,然後再進行對比。一、演算法思想    (一)分治法(divide and conquer method)    是將待求解的原問題劃分成k個較小

回溯判斷字串字尾

題意為給你一個n,k讓你輸出由前k個字母組成的第n個困難字串,困難字串就是沒有任何兩個相鄰的字串完全相同,例如BB,ABCDABCD不是,而A AB ABA ABAC ABACA ABACAB ABACABA為困難的串 例如當n=7,k=3時輸出ABACABA。 解決這個問題就是要避免重複的判斷,當已經判

全排列 II(回溯寬度優先)

int cmp (const void * a, const void * b){return ( *(int*)a - *(int*)b );} int** permuteUnique(int* nu

圖形結構:遍歷模型分治法動態規劃回溯BFSDFS

圖形結構,是樹形結構的擴充套件。 我們在回溯法裡面瞭解到幾種結構:二叉樹,排列樹,完全n叉樹,這幾種解空間型別,都可以直接使用回溯法的框架解決。 二叉樹,排列樹,完全n叉樹,都可以看成x叉樹的變形,而圖形結構就是x叉樹。 在此之前,我們先明白一點:一顆二叉樹是什麼,他是某一顆二叉

動態規劃分治回溯全排列切片

全排列問題,可以從動態規劃狀態方程考慮,也可以從回溯法考慮,二者程式碼遞迴形式的程式碼是一致的,但是理解的角度不同 動態規劃: # 基於動態規劃,狀態方程考慮,f[n] = 首位為所有元素 + f[n-1],這個動態規劃沒有重複 # 子問題,每一種情況都需要遍歷 class Solu

著色問題的程式碼實現(java版)使用回溯貪心思想

著色問題描述:       給圖中的結點塗上顏色,相鄰(直接連通)的結點塗的顏色不能相同。 方法1:回溯法:        回溯法求出的塗色方法是全的,塗色方案不止一種。 &

演算法設計之—直接 遍歷/窮舉貪心演算法、動態規劃、回溯

       演算法是對完成特定問題的程式執行序列描述,表象為從問題初始狀態到問題結束狀態的所有路徑之中尋找可行路徑,若無先驗經驗,根據執行方式不同可以劃分為無規則和有規則(啟發式)方法。       無規則方法為窮舉,改進方法為遞推和迭代;有規則方法有分治、貪心、動態規劃、

USACO1.5.4 Checker Challenge跳棋的挑戰 解題報告(N皇后 回溯)

Description 檢查一個如下的6 x 6的跳棋棋盤,有六個棋子被放置在棋盤上,使得每行,每列,每條對角線(包括兩條主對角線的所有對角線)上都至多有一個棋子。 列號 0 1 2 3 4 5 6 ----------------------

回溯回溯解裝載問題

一、回溯法有“通用的解題法”之稱,可以系統的搜尋一個問題的所有解或任一解。它在問題的解空間中按深度優先策略,從根節點出發,搜尋解空間樹。演算法搜尋至解空間樹的任一節點時,先判斷該節點是否包含問題的解,如果肯定不包含則跳過對以該節點為根的子樹的搜尋,回到其父節點回溯。否則,