小明最近在教鄰居家的小朋友小學奧數,而最近正好講述到了三階幻方這個部分。
三階幻方指的是將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
【題解】使用全排列函式,對1~9進行全排列,先驗證一下是不是在題目所給的矩陣基礎上填寫的,然後在驗證是否滿足三階幻方的要求。如果滿足總計數器就+1,最後判斷一下有幾個滿足條件的,按題目要求輸出結果即可。
#include
using
namespace std;
int a[10]
;int b[10]
=;int ans=0;
int cnt=0;
intmain()
do}if(f==0)
continue
;int xa=b[0]
+b[1
]+b[2]
;int xb=b[3]
+b[4
]+b[5]
;int xc=b[6]
+b[7
]+b[8]
;int ya=b[0]
+b[3
]+b[6]
;int yb=b[1]
+b[4
]+b[7]
;int yc=b[2]
+b[5
]+b[8]
;int dy=b[0]
+b[4
]+b[8]
;int dx=b[2]
+b[4
]+b[6]
;if(xa==xb&&xb==xc&&xa==xc)
ans++;}
}}}while
(next_permutation
(b,b+9)
);//對矩陣進行全排列
if(ans==1)
cout<<<
" ";
cnt++;}
}else
cout<<
"too many"
<}
藍橋杯 九宮幻方
3.九宮幻方 問題描述 小明最近在教鄰居家的小朋友小學奧數,而最近正好講述到了三階幻方這個部分。三階幻方指的是將1 9不重複的填入乙個3 3的矩陣當中,使得每一行 每一列和每一條對角線的和都是相同的。三階幻方又被稱作九宮格,在小學奧數里有一句非常有名的口訣 二四為肩,六八為足,左三右七,戴九履一,五...
藍橋杯 九宮幻方
注意 第一次寫dfs內用了二重迴圈,外層為位置,內層為未使用過的數字,存在先填充了後面又返回填充前面的情況,導致許多重複,按照樣例給出的得出5 120的結果.還是太菜了 後來參考了此部落格 應該是按位置dfs,已經存在資料的位置跳過,直接下乙個位置。此篇部落格僅供記錄錯誤 include using...
藍橋杯 九宮幻方
1.將所有滿足條件的3階幻方列舉出來 使用全排列函式next permutation來實現,函式使用鏈結 2.遍歷所有3階幻方矩陣,統計與輸入矩陣可以匹配的個數 3.include include include include include include using namespace std...