1. 程式人生 > >拉丁方塊填數字--藍橋杯國賽歷年真題

拉丁方塊填數字--藍橋杯國賽歷年真題

方塊填數

 “數獨”是當下炙手可熱的智力遊戲。一般認為它的起源是“拉丁方塊”,是大數學家尤拉於1783年發明的。

如圖[1.jpg]所示:6x6的小格被分為6個部分(圖中用不同的顏色區分),每個部分含有6個小格(以下也稱為分組)。

    開始的時候,某些小格中已經填寫了字母(ABCDEF之一)。需要在所有剩下的小格中補填字母。

    全部填好後,必須滿足如下約束:

    1. 所填字母只允許是A,B,C,D,E,F 中的某一個。

    2. 每行的6個小格中,所填寫的字母不能重複。

    3. 每列的6個小格中,所填寫的字母不能重複。

    4. 每個分組(參見圖中不同顏色表示)包含的6個小格中,所填寫的字母不能重複。

    為了表示上的方便,我們用下面的6階方陣來表示圖[1.jpg]對應的分組情況(組號為0~5):

000011

022013

221113

243333

244455

445555

    用下面的資料表示其已有字母的填寫情況:

32 

    很明顯,第一列表示行號,第二列表示列號,第三列表示填寫的字母。行號、列號都從0開始計算。

    一種可行的填寫方案(此題剛好答案唯一)為:

EF C B D A

AC E D F B

DA B E C F

FB D C A E

BD F A E C

CE A F B D

    你的任務是:編寫程式,對一般的拉丁方塊問題求解,如果多解,要求找到所有解。

【輸入、輸出格式要求】

    使用者首先輸入6行資料,表示拉丁方塊的分組情況。

    接著使用者輸入一個整數n (n<36), 表示接下來的資料行數

    接著輸入n行資料,每行表示一個預先填寫的字母。

    程式則輸出所有可能的解(各個解間的順序不重要)。

    每個解佔用7行。

    即,先輸出一個整數,表示該解的序號(從1開始),接著輸出一個6x6的字母方陣,表示該解。

    解的字母之間用空格分開。

    如果找不到任何滿足條件的解,則輸出“無解”

    例如:使用者輸入:

000011

022013

221113

243333

244455

445555

6

02C

03B

05A

20D

35E

53F

    則程式輸出:

1

EF C B D A

AC E D F B

DA B E C F

FB D C A E

BD F A E C

CE A F B D

   再如,使用者輸入:

001111

002113

022243

022443

544433

555553

7

04B

05A

13D

14C

24E

50C

51A

    則程式輸出:

1

DC E F B A

EF A D C B

AB F C E D

BE D A F C

FD C B A E

CA B E D F

2

DC E F B A

EF A D C B

AD F B E C

BE C A F D

FB D C A E

CA B E D F

3

DC F E B A

AE B D C F

FD A C E B

BF E A D C

EB C F A D

CA D B F E

4

DC F E B A

BE A D C F

AD C F E B

FB E A D C

EF B C A D

CA D B F E

5

DC F E B A

EF A D C B

AB C F E D

BE D A F C

FD B C A E

CA E B D F

6

DC F E B A

EF A D C B

AB D F E C

BE C A F D

FD B C A E

CA E B D F

7

DC F E B A

EF A D C B

AD B F E C

BE C A F D

FB D C A E

CA E B D F

8

DC F E B A

FE A D C B

AD B C E F

BF E A D C

EB C F A D

CA D B F E

9

DC F E B A

FE A D C B

AF C B E D

BD E A F C

EB D C A F

CA B F D E 

報了C/C++組,重新用C++寫了一遍,回來改程式碼。。

思路:用一個6*6的陣列存輸入的顏色值,因為顏色值為0-5,每種顏色有六個格子,用一個6*6陣列記錄每個小部分的值(0-5)用於分類,而遞迴到某個點(x,y)時,要知道它屬於哪個小部分,所以用struct配合陣列記錄每個點(x,y)屬於哪個小部分,陣列的第一個下標就是屬於的小部分(比如[1]=(3,4),座標(3,4)的點屬於第一個小部分),剩下的就簡單了,類似於數獨問題,深搜就行了

程式碼:

#include <iostream>
#include <stdio.h>
#include <vector>
using namespace std;
struct pos{
    int x,y;
};
vector<pos>ps[6];//小方塊的座標
int card[6][6],color[6][6],m,num = 1;
void print(){
    for(int i=0;i<6;i++){
        for(int j=0;j<6;j++){
            printf("%c",'A'+card[i][j]);
        }
        printf("\n");
    }
}
bool check(int x,int y,int v){
    for(int i=0;i<6;i++){
        if(card[x][i] == v || card[i][y] == v || card[ps[color[x][y]][i].x][ps[color[x][y]][i].y] == v)return 0;
    }
    return 1;
}
void dfs(int x,int y){
//    cout<<x<<" "<<y<<endl;
    if(x>=6){
        printf("%d\n",num++);
        print();
        return;
    }else{
        if(card[x][y] == -1){
            for(int i=0;i<6;i++){
                if(check(x, y, i)){
                    card[x][y] = i;
                    dfs(x+(y+1)/6, (y+1)%6);
                    card[x][y] = -1;
                }
            }
        }else{
            dfs(x+(y+1)/6, (y+1)%6);
        }
        
    }
}
int main(int argc, const char * argv[]) {
    // insert code here...
    int p;
    for(int i=0;i<6;i++){
        for(int j=0;j<6;j++){
            card[i][j] = -1;
            pos po;
            po.x = i;
            po.y = j;
            scanf("%d",&p);
            color[i][j] = p;
            ps[p].push_back(po);
        }
    }
    int x,y;
    char c;
    scanf("%d",&m);
    for(int i=0;i<m;i++){
        scanf("%d %d %c",&x,&y,&c);
        card[x][y] = c-'A';
    }

    dfs(0, 0);
    return 0;
}



相關推薦

拉丁方塊數字藍橋歷年

方塊填數  “數獨”是當下炙手可熱的智力遊戲。一般認為它的起源是“拉丁方塊”,是大數學家尤拉於1783年發明的。 如圖[1.jpg]所示:6x6的小格被分為6個部分(圖中用不同的顏色區分),每個部分含有6個小格(以下也稱為分組)。     開始的時候,某些小格中已經填寫了字母

第八屆藍橋Java b組 字母遊戲

小明經常玩 LOL 遊戲上癮,一次他想挑戰K大師,不料K大師說: “我們先來玩個空格填字母的遊戲,要是你不能贏我,就再別玩LOL了”。 K大師在紙上畫了一行n個格子,要小明和他交替往其中填入字母。 並且: 1. 輪到某人填的時候,只能在某個空格中填入L或O 2. 誰先讓字母組成了“LOL”的字樣,誰

第八屆藍橋 發現環

代碼 小明 code for 順序 藍橋杯 藍橋 恢復 臺電腦 問題描述   小明的實驗室有N臺電腦,編號1~N。原本這N臺電腦之間有N-1條數據鏈接相連,恰好構成一個樹形網絡。在樹形網絡上,任意兩臺電腦之間有唯一的路徑相連。   不過在最近一次維護網絡時,

2016第七屆藍橋決賽c/c++本科B組試題總結及解題答案

未完待更新........ 1.一步之遙 從昏迷中醒來,小明發現自己被關在X星球的廢礦車裡。 礦車停在平直的廢棄的軌道上。 他的面前是兩個按鈕,分別寫著“F”和“B”。 小明突然記起來,這

2015第六屆藍橋決賽c/c++本科B組試題總結及解題答案

1. 積分之迷 小明開了個網上商店,賣風鈴。共有3個品牌:A,B,C。 為了促銷,每件商品都會返固定的積分。 小明開業第一天收到了三筆訂單:  第一筆:3個A + 7個B + 1個C,共返積分:315  第二筆:4個A + 10個B + 1個C,共返積分:420 

2016第七屆藍橋-大學A組 隨意組合(dfs)

描述 小明被綁架到X星球的巫師W那裡。 其時,W正在玩弄兩組資料 (2 3 5 8) 和 (1 4 6 7) 他命令小明從一組資料中分別取數與另一組中的數配對,共配成4對(組中的

2017年第八屆“藍橋B組C/C++ 個人題解

前言:我參加了今年第八屆的藍橋杯國賽,只拿了個優秀獎,傷心。官方也沒有公佈試題和答案,在網上搜索了很久都沒有找到藍橋杯國賽的題目。突然有了一個不自量力的想法,趁還有一點記憶,把題目記錄下來,並且附上自己的做法。第一題:36進位制題意:用類似16進位制的表示辦法,A表示10,B

藍橋門禁系統

#include "STC15F2K60S2.h" #include "ds1302.h" //超聲波引腳定義 sbit Sonic_Txd=P1^0; sbit Sonic_Rxd=P1^1; void Delay13us() //@11.0592MHz { unsig

第九屆藍橋參賽心得

ps:這是我第一次參加藍橋杯的國賽,非專門玩ACM的,也很少去徹底鑽研很高深的演算法        我參加的是C/C++大學B組,客觀來說題目從題難度不高,總共6道,我估計自己做出了4.5道,最後拿的是國二,沒有一等獎有點遺憾,不過歸根結底還是自己水平還不夠吧。簡單說下國賽的

2018藍橋總結

大概寫一下。國三 很水。第一題弱智數學題。第二題好像也不難,但是他們是列舉?我是找規律?我找到是3,5,8,13的斐波那契?最後和他們結果差超級多。大概是我錯了吧,畢竟我是國三中等,他們都是一等二等三等頭頭。   第三題是個位運算的題 ,對於位運算我是一點 一點點脾氣都沒有了

星系炸彈(2015年藍橋第2

/*在X星系的廣袤空間中漂浮著許多X星人造“炸彈”,用來作為宇宙中的路標。每個炸彈都可以設定多少天之後爆炸。比如:阿爾法炸彈2015年1月1日放置,定時為15天,則它在2015年1月16日爆炸。有一個貝塔炸彈,n年y月r日放置,定時為t天,請你計算它爆炸的準確日期並按 yyy

2016 藍橋 JAVA A組第二 湊平方數

剛拿到這題,沒有思路。明明知道是遞歸回溯,卻搞不清很多細節,直到找到一篇博文。。 感謝原博主的分享,學到了很多東西 原博請見:http://blog.csdn.net/sunshine_java_l/article/details/72663583 湊平方數 把0~9這

第五屆藍橋Java B組——猜字母

package lanqiaobei; /* 標題:猜字母 把abcd...s共19個字母組成的序列重複拼接106次,得到長度為2014的串。 接下來刪除第1個字母(即開頭的字母a),

2017年第八屆藍橋試題(JavaA組)

部分 int 重疊 黃色 next 時間 希望 一行 jdk1 1.結果填空 (滿分19分)2.結果填空 (滿分47分)3.代碼填空 (滿分21分)4.程序設計(滿分35分)5.程序設計(滿分79分)6.程序設計(滿分99分) 1.標題:圖書排列 將編號為1~10的1

2016藍橋java C組第十 密碼脫落

暑假以來刷藍橋杯題,實在被暴力所折服,終於碰到一眼前一亮的題~~~ 第一篇線上的部落格,開寫~~~ 密碼脫落 X星球的考古學家發現了一批古代留下來的密碼。 這些密碼是由A、B、C、D 四種植物的種子串成的序列。 仔細分析發現,這些密碼串當初應該是前後對稱的(也就是我們說的映

2018 藍橋 B 組模擬(一)-U型數字

最近蒜頭君喜歡上了U型數字,所謂U型數字,就是這個數字的每一位先嚴格單調遞減,後嚴格單調遞增。比如 212212 就是一個U型數字,但是 333333, 9898, 567567, 3131331313,就是不是U型數字。 現在

六角數|2014年藍橋B組解析第七-fishers

std 計算 求解 相等 include http 通過 mes esp 六角填數 如圖所示六角形中,填入1~12的數字。 使得每條直線上的數字之和都相同。 圖中,已經替你填好了3個數字,請你計算星號位置所代表的數字是多少? 請通過瀏覽器提交答案,不要填寫多余的內容。 思

【DFS數】(2016)第七屆藍橋 C/C++ A組 題解(第三

第三題 題目     如圖,如下的10個格子,填入0~9的數字。要求:連續的兩個數字不能相鄰。  (左右、上下、對角都算相鄰)一共有多少種可能的填數方案?  請填寫表示方案數目的整數。思路分析     

藍橋模擬 青出於藍而勝於藍

葉子 我們 樹狀數組 for def rip ear 空格 輸入 武當派一共有 nn 人,門派內 nn 人按照武功高低進行排名,武功最高的人排名第 11,次高的人排名第 22,... 武功最低的人排名第 nn。現在我們用武功的排名來給每個人標號,除了祖師爺,每個人都有一個

第八屆藍橋 分巧克力

ret else pac AC 時間復雜度 輸出格式 names std mil 問題描述  兒童節那天有K位小朋友到小明家做客。小明拿出了珍藏的巧克力招待小朋友們。  小明一共有N塊巧克力,其中第i塊是Hi x Wi的方格組成的長方形。   為了公平起見,小明需要從這N塊