歷屆試題 九宮幻方
時間限制:1.0s 記憶體限制:256.0mb
問題描述
小明最近在教鄰居家的小朋友小學奧數,而最近正好講述到了三階幻方這個部分,三階幻方指的是將1~9不重複的填入乙個3*3的矩陣當中,使得每一行、每一列和每一條對角線的和都是相同的。
三階幻方又被稱作九宮格,在小學奧數里有一句非常有名的口訣:「二四為肩,六八為足,左三右七,戴九履一,五居其中」,通過這樣的一句口訣就能夠非常完美的構造出乙個九宮格來。
4 9 2
3 5 7
8 1 6
有意思的是,所有的三階幻方,都可以通過這樣乙個九宮格進行若干映象和旋轉操作之後得到。現在小明準備將乙個三階幻方(不一定是上圖中的那個)中的一些數抹掉,交給鄰居家的小朋友來進行還原,並且希望她能夠判斷出究竟是不是只有乙個解。
而你呢,也被小明交付了同樣的任務,但是不同的是,你需要寫乙個程式~
輸入格式
輸入僅包含單組測試資料。
每組測試資料為乙個3*3的矩陣,其中為0的部分表示被小明抹去的部分。
對於100%的資料,滿足給出的矩陣至少能還原出一組可行的三階幻方。
輸出格式
如果僅能還原出一組可行的三階幻方,則將其輸出,否則輸出「too many」(不包含引號)。
樣例輸入
0 7 2
0 5 0
0 3 0
樣例輸出
6 7 2
1 5 9
8 3 4
資料規模和約定
峰值記憶體消耗(含虛擬機器) < 256m
cpu消耗 < 1000ms
請嚴格按要求輸出,不要畫蛇添足地列印類似:「請您輸入...」 的多餘內容。
注意:main函式需要返回0;
只使用ansi c/ansi c++ 標準;
不要呼叫依賴於編譯環境或作業系統的特殊函式。
所有依賴的函式必須明確地在原始檔中 #include
不能通過工程設定而省略常用標頭檔案。
提交程式時,注意選擇所期望的語言型別和編譯器型別。
--------------
笨笨有話說:
我最喜歡這類題目了。既然九宮幻方一共也沒有多少,我就不辭辛勞地乙個乙個寫出來好了。
也不能太過分,好歹用個陣列。
// 這道題不難,關鍵在於剪枝,不剪枝的話,應該只能過70%左右
#include#include#include#include#include#include#include#include#include#include#include#include#include#include#define eps (1e-8)
#define max 0x3f3f3f3f
#define u_max 1844674407370955161
#define l_max 9223372036854775807
#define i_max 2147483647
#define re register
#define pushup() tree[rt]=max(tree[rt<<1],tree[rt<<1|1])
#define nth(k,n) nth_element(a,a+k,a+n); // 將 第k大的放在k位
#define ko() for(int i=2;i<=n;i++) s=(s+k)%i // 約瑟夫
#define ok() v.erase(unique(v.begin(),v.end()),v.end()) // 排序,離散化
#define catalan c(2n,n)-c(2n,n-1) (1,2,5,14,42,132,429...) // 卡特蘭數
using namespace std;
inline int read()
while(c >= '0' & c <= '9') x = x * 10 + c - '0', c = getchar();
return x * f;
}typedef long long ll;
const double pi = atan(1.)*4.;
const int inf = 0x3f3f3f3f;
const ll inf = 0x3f3f3f3f3f3f3f3fll;
const int m=63;
const int n=1e5+5;
int n=0,a[5][5],v[10],b[10],p=0,sum=0,c[5][5];
bool fun()
void dfs(int num)
cut+=a[i][j]; .
} .
if(!leap&&cut!=15)
return ;
}for(int i=0;i<3;i++)
cut+=a[j][i];
}if(!leap&&cut!=15) .
return ; .
}int cut=0,leap=0;
for(int i=0;i<3;i++)
cut+=a[i][i];
}if(!leap) .
cut=0,leap=0;
for(int i=0;i<3;i++)
cut+=a[i][2-i]; .
} .
if(!leap) -------
if(num==n)
sum++;}}
return ;
}for(int j=0;j<3;j++)}}
}}int main()
}for(int i=1;i<=9;i++)
dfs(0);
if(sum==1)
printf("\n");}}
else
printf("too many\n");
return 0;
}
藍橋杯 九宮幻方
3.九宮幻方 問題描述 小明最近在教鄰居家的小朋友小學奧數,而最近正好講述到了三階幻方這個部分。三階幻方指的是將1 9不重複的填入乙個3 3的矩陣當中,使得每一行 每一列和每一條對角線的和都是相同的。三階幻方又被稱作九宮格,在小學奧數里有一句非常有名的口訣 二四為肩,六八為足,左三右七,戴九履一,五...
列舉法 九宮幻方
題目描述 小明最近在教鄰居家的小朋友小學奧數,而最近正好講述到了三階幻方這個部分。三階幻方指的是將1 9不重複的填入乙個3 3的矩陣當中,使得每一行 每一列和每一條對角線的和都是相同的。三階幻方又被稱作九宮格,在小學奧數里有一句非常有名的口訣 二四為肩,六八為足,左三右七,戴九履一,五居其中 通過這...
歷屆試題 九宮幻方
歷屆試題 九宮幻方 時間限制 1.0s 記憶體限制 256.0mb 問題描述 小明最近在教鄰居家的小朋友小學奧數,而最近正好講述到了三階幻方這個部分,三階幻方指的是將1 9不重複的填入乙個3 3的矩陣當中,使得每一行 每一列和每一條對角線的和都是相同的。三階幻方又被稱作九宮格,在小學奧數里有一句非常...