方塊填數演算法詳解

2021-09-29 12:36:19 字數 1439 閱讀 3933

1. 問題描述

數獨」是當下炙手可熱的智力遊戲。一般認為它的起源是「拉丁方塊」,是大數學家尤拉於2023年發明的。如圖所示:6x6的小格被分為6個部分(圖中用不同的顏色區分),每個部分含有6個小格(以下也稱為分組)。開始的時候,某些小格中已經填寫了字母(abcdef之一)。需要在所有剩下的小格中補填字母。全部填好後,必須滿足如下約束:

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

000011

022013

221113

243333

244455

445555

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

02c03b

05a20d

35e53f

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

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

e f c b d a

a c e d f b

d a b e c f

f b d c a e

b d f a e c

c e a f b d

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

【輸入、輸出格式要求】

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

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

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

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

每個解占用7行。

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

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

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

2. 演算法分析

#include #include #define n 6

int grouparry[n][n];//描述方格顏色屬性

char datarry[n][n];//字元方格

char zifu[n]=;

int k=0;

int main()

void inputdata(int grouparry[n][n],char datarry[n][n])

if(datarry[x][y]=='#')//如果不等於#則跳過當前方格

}else

dfs(x+(y+1)/6,(y+1)%6);

}

藍橋杯 方塊填數 DFS搜尋

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

藍橋杯決賽之方塊填數

程式設計題 滿分33分 數獨 是當下炙手可熱的智力遊戲。一般認為它的起源是 拉丁方塊 是大數學家尤拉於1783年發明的。如圖 1.jpg 所示 6x6的小格被分為6個部分 圖中用不同的顏色區分 每個部分含有6個小格 以下也稱為分組 開始的時候,某些小格中已經填寫了字母 abcdef之一 需要在所有剩...

演算法競賽 3 3蛇形填數

在n n方陣裡填入1,2,n n,要求填成蛇形。例如n 4時方陣為 10 11 12 1 9 16 13 2 8 15 14 3 7 6 5 4 上面的方陣中,多餘的空格只是為了便於觀察規律,不必嚴格輸出。n 8。題目做完發現了幾個要注意的地方 1.對二維陣列的初始化應該是a maxn maxn 或...