藍橋杯 方塊填數 數獨 dfs 狀壓 c

2021-08-19 04:10:32 字數 1511 閱讀 4253

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

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

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

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

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

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

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

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

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

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

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

深蒐時對 行 列 分組 三個flag(fr fc fg)狀壓判斷是否滿足條件進行剪枝。

這題如果沒有條件4(分組限制)就很容易做了,所以關鍵就是怎麼快速判斷分組是否滿足條件。

這裡用了乙個map做了個簡單的雜湊表,每個位置[i][j]在map中都有對應(即:m[i*10+j])。在輸入分組時就將每個位置的map指向對應的分組標誌(fg)上,即為程式中 m[i*10+j]=c-'0' 語句(c-'0'即為fg下標)。此時fg[m[i*10+j]]就能方便記錄和檢視該組已有字母。理解這關鍵的一點,其他的就好說了。

上**:

#include #include using namespace std;

mapm;

int a[6][6],v[6][6];

int fr[6],fc[6],fg[6];

int cnt;

void dfs(int x,int y)

if(v[x][y])

for(int i=0;i<6;i++) }

cin>>n;

while(n--)

{ cin>>x>>y>>c;

x-='0';

y-='0';

c-='a';

a[x][y]=c;

v[x][y]=1;

fr[x]^=1<

藍橋杯 方塊填數 DFS搜尋

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

藍橋杯 數獨 DFS

題目 你一定聽說過 數獨 遊戲。如 圖1.png 玩家需要根據9 9盤面上的已知數字,推理出所有剩餘空格的數字,並滿足每一行 每一列 每乙個同色九宮內的數字均含1 9,不重複。數獨的答案都是唯一的,所以,多個解也稱為無解。本圖的數字據說是芬蘭數學家花了3個月的時間設計出來的較難的題目。但對會使用計算...

藍橋杯決賽之方塊填數

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