藍橋杯之2n皇後

来源:https://www.cnblogs.com/nougat/archive/2018/01/26/8354488.html
-Advertisement-
Play Games

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


問題:     給定一個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 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

 

 

分析:1.用一個二維數組構造出一個n*n的矩陣。

   2.逐行選擇某個合適的坐標來放置所謂的黑或者白皇後(如果放了黑,下次就放白的)。

     3.接著步驟2,放另一種皇後。

 

步驟二和步驟三的實現:

 1 void dfs(int i,int q)//i是初始行  q指的是是否在某位置上放置皇後 
 2 {
 3     for(int j=0;j<n;j++) 
 4     {
 5         //不能放的或者已經放過的 
 6         if(s[i][j]==0||s[i][j]==2)//已經放過的是2 
 7         {
 8             continue;
 9         }
10         int flag=1;//預設可以放 
11         int y1=j-1;//左上角的黑皇後 
12         int y2=j+1;//右上角的黑皇後 
13         for(int l=i-1;l>=0;l--) 
14         {
15             //判斷同一列、斜線上是否有相同皇後(同行肯定不會有:從上到下進行的) 
16             //同一列
17             if(s[l][j]==q)//判斷同一列上是否有相同的皇後 
18             {
19                 flag=0;
20                 break;
21             }
22             //斜線
23             if(y1>=0&&s[l][y1]==q)//判斷左對角線上是否有 
24             {
25                 flag=0;
26                 break;
27             }
28             y1--;    
29             if(y2<n&&s[l][y2]==q)
30             {
31                 flag=0;
32                 break;
33             }
34             y2++;
35         }
36         if(flag)
37         {
38             s[i][j]=q;//放皇後 
39             if(i<n-1)
40             {
41                 dfs(i+1,q);
42             } 
43             else
44             {
45                 //黑皇後放完了,開始放白皇後;
46                 //白皇後放完的話就是一種方法結束 
47                 if(q==2)
48                 {
49                     dfs(0,3);
50                 }
51                 else
52                 {
53                     count++;
54                 }
55             }
56             s[i][j]=1;//複原開始下一次 
57         }
58     }
59 }

現在用C來實現

(其實用啥都一樣,我不是太會用C++)

 1 #include <stdio.h>
 2 void dfs(int i,int q);
 3 int s[13][13];
 4 int n,count=0;
 5 int main(){
 6     scanf("%d",&n);
 7     for(int i=0;i<n;i++)
 8     {
 9         for(int j=0;j<n;j++)
10         {
11             scanf("%d",&s[i][j]);//對矩陣賦值 
12         }
13     }
14     dfs(0,2);//黑皇後 
15     printf("%d",count);
16     return 0;
17 }
18 void dfs(int i,int q)//i=0  q=2 
19 {
20     for(int j=0;j<n;j++) 
21     {
22         //不能放的或者已經放過的 
23         if(s[i][j]==0||s[i][j]==2)//已經放過的是2 
24         {
25             continue;
26         }
27         int flag=1;//預設可以放 
28         int y1=j-1;//左上角的黑皇後 
29         int y2=j+1;//右上角的黑皇後 
30         for(int l=i-1;l>=0;l--) 
31         {
32             //判斷同一列、斜線上是否有相同皇後(同行肯定不會有:從上到下進行的) 
33             //同一列
34             if(s[l][j]==q)//判斷同一列上是否有相同的皇後 
35             {
36                 flag=0;
37                 break;
38             }
39             //斜線
40             if(y1>=0&&s[l][y1]==q)//判斷左對角線上是否有 
41             {
42                 flag=0;
43                 break;
44             }
45             y1--;    
46             if(y2<n&&s[l][y2]==q)
47             {
48                 flag=0;
49                 break;
50             }
51             y2++;
52         }
53         if(flag)
54         {
55             s[i][j]=q;//放皇後 
56             if(i<n-1)
57             {
58                 dfs(i+1,q);
59             } 
60             else
61             {
62                 //黑皇後放完了,開始放白皇後;
63                 //白皇後放完的話就是一種方法結束 
64                 if(q==2)
65                 {
66                     dfs(0,3);
67                 }
68                 else
69                 {
70                     count++;
71                 }
72             }
73             s[i][j]=1;//複原開始下一次 
74         }
75     }
76 }

下麵是不正宗的C++

#include<iostream>
using namespace std;
int s[13][13];
int n;
int count=0;//計數 
void dfs(int i,int q)//i=0  q=2 
{
    for(int j=0;j<n;j++) 
    {
        //不能放的或者已經放過的 
        if(s[i][j]==0||s[i][j]==2)//已經放過的是2 
        {
            continue;
        }
        int flag=1;//預設可以放 
        int y1=j-1;//左上角的黑皇後 
        int y2=j+1;//右上角的黑皇後 
        for(int l=i-1;l>=0;l--) 
        {
            //判斷同一列、斜線上是否有相同皇後(同行肯定不會有:從上到下進行的) 
            //同一列
            if(s[l][j]==q)//判斷同一列上是否有相同的皇後 
            {
                flag=0;
                break;
            }
            //斜線
            if(y1>=0&&s[l][y1]==q)//判斷左對角線上是否有 
            {
                flag=0;
                break;
            }
            y1--;    
            if(y2<n&&s[l][y2]==q)
            {
                flag=0;
                break;
            }
            y2++;
        }
        if(flag)
        {
            s[i][j]=q;//放皇後 
            if(i<n-1)
            {
                dfs(i+1,q);
            } 
            else
            {
                //黑皇後放完了,開始放白皇後;
                //白皇後放完的話就是一種方法結束 
                if(q==2)
                {
                    dfs(0,3);
                }
                else
                {
                    count++;
                }
            }
            s[i][j]=1;//複原開始下一次 
        }
    }
}
int main()
{
    cin>>n;//對n賦值 
    for(int i=0;i<n;i++)
    {
        for(int j=0;j<n;j++)
        {
            cin>>s[i][j];//對矩陣賦值 
        }
    }
    dfs(0,2);//黑皇後 
    cout<<count<<endl;
    return 0;
}

結尾了,,有什麼不懂的私聊我,一起學習,一起進步。1186294207


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 文章系國內領先的 ITOM 管理平臺供應商 OneAPM 編譯呈現。 網頁性能是一個豐富且又複雜的話題。在本帖中,我們會將討論的範圍局限在前端 JavaScript 框架上,探究相對於另外一種框架而言,使用當前的框架會如何影響您的應用程式的性能。我們會特別關註兩點: (1)某種框架要使用多長的時間來 ...
  • $("[id*='Custom']").removeAttr("disabled") ...
  • 一、學習目標 瞭解工廠模式基本概念 瞭解工廠模式優點 工廠模式實例 二、基本概念 工廠模式(Factory Pattern)是Java中最常用的設計模式之一。這種類型的設計模式屬於創建型模式,它提供了一種創建對象的最佳方式。在工廠模式中,我們在創建對象時不會對客戶端暴露創建邏輯,並且是通過使用一個共 ...
  • 本篇內容基於 Python3 TensorFlow 1.4 版本。 本節內容 本節通過最簡單的示例 —— 平面擬合來說明 TensorFlow 的基本用法。 構造數據 TensorFlow 的引入方式是: 接下來我們構造一些隨機的三維數據,然後用 TensorFlow 找到平面去擬合它,首先我們用 ...
  • Web應用中通常需要訪問的Servlet API就是HttpServletRequest、HttpSession和ServletContext,這三個介面分別代表JSP內置對象中的request、session和application。 1.使用Struts2提供的ActionContext類來訪問 ...
  • Java DBCP連接池設置以及說明 ...
  • Markdown 語法快速入門 [TOC](博客園Markdown引擎暫不支持) 標題 第一級標題 第二級標題 第六級標題 強調 斜體字 : _斜體字_: 加粗 : __斜體字__: 列表 無序列表: 有序列表: 任務列表: [ ]未完成任務 [x] 已完成任務 插入鏈接及圖片 插入鏈接: Eg. ...
  • QT5 TCP網路通訊 伺服器與客戶端建立連接listen() - connectToHost(); 觸發newPendingConnect信號 實時數據通訊write(); read(); 觸發readyRead信號 通訊主要使用的類: QTcpServer Class QTcpServer類提供 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...