洛谷1274 魔術數字遊戲 題解

2022-05-20 07:18:34 字數 1428 閱讀 5502

至少在洛谷2023年7月10日和之前,我擁有不打表程式中的 rank 1 提交記錄

神奇的提交記錄

吐槽一下樣例,它是不完整的。

首先為了方便計算我們顯然要把乙個格仔的兩個座標壓成乙個整數。

具體計算方法將\((i,j)\)轉換為\((i-1)\times4+j-1\)。

這裡我來介紹一種比較簡潔的打法,首先我們打表預處理出所有的互相影響的塊。

它長得像這樣(由於4個角落的條件與中間4個的條件和對角線的條件衝突,所以不用考慮了):

int b[15][4] = ,,,

,//col,,

,,

//djx,,

//mid

,//block,,

,//jl

//};

在手算的時候注意讓每個塊內的四個元素從小到大排列,或者說至少最大的在最後,那麼我們計算到每塊第四個元素的時候,就可以直接計算了。

然後預處理每個元素是否能夠被剪枝。

for (int i = 0; i < 15; ++i)

xz[b[i][3]][cnt[b[i][3]]++] = i;

然後我們接下來直接dfs,當搜尋到乙個格仔的時候,首先將它置為0。

開乙個vis陣列避免數字選擇重複。

\(pos1\)表示題目限制的數字\(1\)的位置。

然後就珂以這樣來判斷剪枝:

a[num] = 0;

for (int i = 0; i < cnt[num]; ++i)

else

}

然後如果\(a[num]\)還沒有值就列舉(為了提高效率在\(pos1\)特殊處理)。

if (num == pos1)

else

}

整個主體和構思非常簡潔明瞭。

然後一遍ac完結撒花!

沒有壓行,所以較長。

#include int b[15][4] = ,,,

,//col,,

,,

//djx,,

//mid

,//block,,

,//jl

//};int a[16];

int vis[17];

int xz[16][10];

int cnt[16];

int pos1;

void dfs(int num)

a[num] = 0;

for (int i = 0; i < cnt[num]; ++i)

else

}if (!a[num])

else}}

else

}int main()

魔術數字遊戲

填數字方格的遊戲有很多種變化,如下圖所示的4 4方格中,我們要選擇從數字1到16來填滿這十六個格仔 aij,其中i 1.4,j 1.4 為了讓遊戲更有挑戰性,我們要求下列六項中的每一項所指定的四個格仔,其數字累加的和必須為34 四個角落上的數字,即a11 a14 a41 a44 34。每個角落上的2...

洛谷P1043數字遊戲題解 zhengjun

題目描述 丁丁最近沉迷於乙個數字遊戲之中。這個遊戲看似簡單,但丁丁在研究了許多天之後卻發覺原來在簡單的規則下想要贏得這個遊戲並不那麼容易。遊戲是這樣的,在你面前有一圈整數 一共n nn個 你要按順序將其分為m mm個部分,各部分內的數字相加,相加所得的m mm個結果對10 1010 取模後再相乘,最...

洛谷1043 數字遊戲

洛谷1043 數字遊戲 題目描述 丁丁最近沉迷於乙個數字遊戲之中。這個遊戲看似簡單,但丁丁在研究了許多天之後卻發覺原來在簡單的規則下想要贏得這個遊戲並不那麼容易。遊戲是這樣的,在你面前有一圈整數 一共n個 你要按順序將其分為m個部分,各部分內的數字相加,相加所得的m個結果對10取模後再相乘,最終得到...