魔術數字遊戲

2021-07-10 20:21:31 字數 2463 閱讀 4056

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

四個角落上的數字,即a11+a14+a41+a44=34。

每個角落上的2×2方格中的數字,例如左上角:a11+a12+a21+a22=34。

最中間的2×2方格中的數字,即a22+a23+a32+a33=34。

每條水平線上四個格仔中的數字,即ai1+ai2+ai3+ai4=34,其中i=1..4。

每條垂直線上四個格仔中的數字,即a1j+a2j+a3j+a4j=34,其中j=1..4。

兩條對角線上四個格仔中的數字,例如左上角到右下角:a11+a22+a33+a44=34。

右上角到左下角:a14+a23+a32+a41=34

a11 a12 a13 a14

a21 a22 a23 a24

a31 a32 a33 a34

a41 a42 a43 a44

【輸入】

輸入檔案會指定把數字1先固定在某一格內。輸入的檔案只有一行包含兩個正資料i和j,表示第1行和第j列的格仔放數字1。剩下的十五個格仔,請按照前述六項條件用數字2到16來填滿。

【輸出】

把全部的正確解答用每4行一組寫到輸出檔案,每行四個數,相鄰兩數之間用乙個空格隔開。兩組答案之間,要以乙個空白行相間,並且依序排好。排序的方式,是先從第一行的數字開始比較,每一行數字,由最左邊的數字開始比,數字較小的解答必須先輸出到檔案中。

【樣例】

magic.in

1 1

magic.out

1 4 13 16

14 15 2 3

8 5 12 9

11 10 7 6

1 4 13 16

14 15 2 3

12 9 8 5

7 6 11 10

…(這後面的輸出是沒給完的)

這道題就是乙個裸的暴搜我還是寫了這麼久qaq

因為題目資訊給的太多,4*4以及很多和要為34,剪枝很好剪,我就直接開掛對每個位置特判一下。比如說在(1,4)的時候檢查第一行是否為34,在(1,4)時檢查第一列的和和對角線的和。然後在除錯的時候我發現,對於樣例中(1,1)為1的情況 第一列會是這樣:

——第一次:1 2 2 x 返回

——第二次:1 2 3 x 返回

我覺得我是該做點什麼來阻止這愚蠢的行為了。於是我在每個要求的區域和為34的第三個點特判,先把前兩個的和算出來,(當前要填的為i)

——-i=max(i,34-mx[1][2]-mx[1][1]-16);

——-if(i>16) return ;

意思應該很好懂,這是(1,3)處的特判。然後我又發現這一列的和明明前三個就已經大於34了還在搜, = =,真是看不下去了。於是對於每個搜到的點計算列之和還有行之和,大於34直接return。看來效果好像不錯的樣子,最慢的乙個點0.2s。

為什麼這麼長= =因為全是特判。

#include

#include

#include

#include

#include

using namespace std;

int i,j,sum,used[20];

int mx[5][5],cnt=0;

void dfs(int x,int y)

int l=2,r=16;

if(x==i&&y==j) l=r=1;

for(int i=l;i<=r;i++)

else

if(x==4)

else

if(x%2==0&&y%2==0)

if(x==1&&y==3)

else

if(x==2&&y==1)

else

if(x==2&&y==3)

else

if(x==3&&y==2)

else

if(x==3&&y==3)

else

if(x==4&&y==1)

else

if(x==4&&y==3)

else

if(x==4&&y==1)

else

if(x==4&&y==4)

if(used[i]) continue;

mx[x][y]=i;

used[i]=1;

int nx=x,ny=y+1;

if(ny==5) nx=x+1,ny=1;

dfs(nx,ny);

used[i]=0;

mx[x][y]=0;

}}int main()

洛谷1274 魔術數字遊戲 題解

至少在洛谷2019年7月10日和之前,我擁有不打表程式中的 rank 1 提交記錄 神奇的提交記錄 吐槽一下樣例,它是不完整的。首先為了方便計算我們顯然要把乙個格仔的兩個座標壓成乙個整數。具體計算方法將 i,j 轉換為 i 1 times4 j 1 這裡我來介紹一種比較簡潔的打法,首先我們打表預處理...

1271 十六進製制魔術數字

題目描述 你有乙個十進位制數字,請按照此規則將它變成 十六進製制魔術數字 首先將它變成字母大寫的十六進製制字串,然後將所有的數字 0 變成字母 o 將數字 1 變成字母 i 如果乙個數字在轉換後只包含 那麼我們就認為這個轉換是有效的。給你乙個字串 num 它表示乙個十進位制數 n,如果它的十六進製制...

表示不同檔案型別的魔術數字

這裡所說的表示不同檔案型別的魔術數字,指定是檔案的最開頭的幾個用於唯一區別其它檔案型別的位元組,有了這些魔術數字,我們就可以很方便的區別不同的檔案,這也使得程式設計變得更加容易,因為我減少了我們用於區別乙個檔案的檔案型別所要花費的時間。比如,乙個jpeg檔案,它開頭的一些位元組可能是類似這樣的 ff...