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

2021-08-08 00:06:54 字數 2972 閱讀 9535

方塊填數

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

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

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

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

1. 所填字母只允許是a,b,c,d,e,f 中的某乙個。

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

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

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

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

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

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的字母方陣,表示該解。

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

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

例如:使用者輸入:

6 02c

03b05a

20d35e

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

再如,使用者輸入:

7 04b

05a13d

14c24e

50c51a

則程式輸出:

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 #include #include using namespace std;

struct pos;

vectorps[6];//小方塊的座標

int card[6][6],color[6][6],m,num = 1;

void print()

printf("\n");

}}bool check(int x,int y,int v)

return 1;

}void dfs(int x,int y)else

}}else

}}int main(int argc, const char * argv)

}int x,y;

char c;

scanf("%d",&m);

for(int i=0;i

藍橋杯省賽真題 方格填數

如下的10個格仔 如果顯示有問題,也可以參看 圖1.jpg 填入0 9的數字。要求 連續的兩個數字不能相鄰。左右 上下 對角都算相鄰 一共有多少種可能的填數方案?請填寫表示方案數目的整數。注意 你提交的應該是乙個整數,不要填寫任何多餘的內容或說明性文字。用全排列,然後再判斷每兩個位置之間的數是否滿足...

第四屆藍橋杯(國賽) 填算式

問題描述 請看下面的算式 abcd efgh xy 900 每個字母代表乙個 0 9 的數字,不同字母代表不同數字,首位不能為 0。比如,5012 4987 36 就是乙個解。請找到另乙個解,並提交該解中 abcd 所代表的整數。答案提交 請嚴格按照格式,通過瀏覽器提交答案。注意 只提交 abcd ...

藍橋杯第七屆國賽JAVA真題 七星填數

七星填數 如圖 圖1.png 所示。在七角星的14個節點上填入1 14 的數字,不重複,不遺漏。要求每條直線上的四個數字之和必須相等。圖中已經給出了3個數字。請計算其它位置要填充的數字,答案唯一。填好後,請提交綠色節點的4個數字 從左到右,用空格分開 比如 12 5 4 8 當然,這不是正確的答案。...