「數獨」是當下炙手可熱的智力遊戲。一般認為它的起源是「拉丁方塊」,是大數學家尤拉於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之一 需要在所有剩...