[蓝桥杯2017初赛]九宫幻方-数论+next_permutation枚举
題目描述
小明最近在教鄰居家的小朋友小學(xué)奧數(shù),而最近正好講述到了三階幻方這個部分。
三階幻方指的是將1~9不重復(fù)的填入一個33的矩陣當(dāng)中,使得每一行、每一列和每一條對角線的和都是相同的。
三階幻方又被稱作九宮格,在小學(xué)奧數(shù)里有一句非常有名的口訣:
“二四為肩,六八為足,左三右七,戴九履一,五居其中”,
通過這樣的一句口訣就能夠非常完美的構(gòu)造出一個九宮格來。
4 9 2
3 5 7
8 1 6
有意思的是,所有的三階幻方,都可以通過這樣一個九宮格進(jìn)行若干鏡像和旋轉(zhuǎn)操作之后得到。
現(xiàn)在小明準(zhǔn)備將一個三階幻方(不一定是上圖中的那個)中的一些數(shù)抹掉,交給鄰居家的小朋友來進(jìn)行還原,并且希望她能夠判斷出究竟是不是只有一個解。
而你呢,也被小明交付了同樣的任務(wù),但是不同的是,你需要寫一個程序~
輸入
輸入一個33的矩陣,其中為0的部分表示被小明抹去的部分。
對于100%的數(shù)據(jù),滿足給出的矩陣至少能還原出一組可行的三階幻方。
輸出
如果僅能還原出一組可行的三階幻方,則將其輸出,否則輸出“Too Many”(不包含引號)。
樣例輸入
0 7 2
0 5 0
0 3 0
樣例輸出
6 7 2
1 5 9
8 3 4
解題思路:
用全排列函數(shù)枚舉,先判斷是不是在題目所給的矩陣基礎(chǔ)上填寫的,然后統(tǒng)計符合題意的次數(shù)。
知識點:3階幻方每一行、每一列和每一條對角線的和都是15,其他階次的幻方其每一行、每一列和每一條對角線的和也都是某個常數(shù)
代碼如下:
#include <iostream> #include <algorithm>using namespace std;int a[] = {1, 2, 3, 4, 5, 6, 7, 8, 9};//用來枚舉 int b[10];//符合情況的地圖 int vis[10];//標(biāo)記初始放置的數(shù)字的位置 int mp[10];//初始地圖bool check() {for (int i = 0; i <= 8; i++) {if (vis[i] != a[i] && vis[i] != 0)return false;}if (a[0] + a[1] + a[2] != 15 )return false;if (a[3] + a[4] + a[5] != 15)return false;if (a[6] + a[7] + a[8] != 15)return false;if (a[0] + a[3] + a[6] != 15)return false;if (a[1] + a[4] + a[7] != 15)return false;if (a[2] + a[5] + a[8] != 15)return false;if (a[0] + a[4] + a[8] != 15)return false;if (a[2] + a[4] + a[6] != 15)return false;for (int i = 0; i <= 8; i++)b[i] = a[i];return true; }int main() {for (int i = 0; i <= 8; i++) {cin >> mp[i];if (mp[i] != 0)vis[i] = mp[i];}int ans = 0;do {if (check())ans++;if (ans > 1) {cout << "Too Many" << endl;return 0;}} while (next_permutation(a, a + 9));int count = 0;for (int i = 0; i <= 8; i++) {count++;cout << b[i] << " ";if (count % 3 == 0)cout << endl;}return 0;} 創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎勵來咯,堅持創(chuàng)作打卡瓜分現(xiàn)金大獎總結(jié)
以上是生活随笔為你收集整理的[蓝桥杯2017初赛]九宫幻方-数论+next_permutation枚举的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: PDF编辑器怎么编辑修改内容PDF文件如
- 下一篇: 树的存储结构-双亲表示法