蓝桥杯 九宫幻方(枚举全排列)
作者:互联网
题目描述
小明最近在教邻居家的小朋友小学奥数,而最近正好讲述到了三阶幻方这个部分,三阶幻方指的是将1~9不重复的填入一个3*3的矩阵当中,使得每一行、每一列和每一条对角线的和都是相同的。
三阶幻方又被称作九宫格,在小学奥数里有一句非常有名的口诀:“二四为肩,六八为足,左三右七,戴九履一,五居其中”,通过这样的一句口诀就能够非常完美的构造出一个九宫格来。
4 9 2
3 5 7
8 1 6
有意思的是,所有的三阶幻方,都可以通过这样一个九宫格进行若干镜像和旋转操作之后得到。现在小明准备将一个三阶幻方(不一定是上图中的那个)中的一些数抹掉,交给邻居家的小朋友来进行还原,并且希望她能够判断出究竟是不是只有一个解。
而你呢,也被小明交付了同样的任务,但是不同的是,你需要写一个程序~ 输入 输入仅包含单组测试数据。
每组测试数据为一个3*3的矩阵,其中为0的部分表示被小明抹去的部分。
对于100%的数据,满足给出的矩阵至少能还原出一组可行的三阶幻方。 输出 如果仅能还原出一组可行的三阶幻方,则将其输出,否则输出“Too Many”(不包含引号)。 样例输入
我最喜欢这类题目了。既然九宫幻方一共也没有多少,我就不辞辛劳地一个一个写出来好了。
也不能太过分,好歹用个数组。 思路:把这九个数字当做一维数组b[9]输入,然后对数字1-9进行枚举全排列a[9], 当b[i]不为0的情况下,a[i]与b[i]对应相等时, 并且数组a满足九宫幻方的特点时,计数次数cnt +1,并把a[]保存到结果数组result[]中。 注意:由于此处只用到了数组中的部分数字,所以需要考虑对局面进行判重,但是考虑到本题的实际情况,所以并不需要判重。
三阶幻方又被称作九宫格,在小学奥数里有一句非常有名的口诀:“二四为肩,六八为足,左三右七,戴九履一,五居其中”,通过这样的一句口诀就能够非常完美的构造出一个九宫格来。
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提示 笨笨有话说:
我最喜欢这类题目了。既然九宫幻方一共也没有多少,我就不辞辛劳地一个一个写出来好了。
也不能太过分,好歹用个数组。 思路:把这九个数字当做一维数组b[9]输入,然后对数字1-9进行枚举全排列a[9], 当b[i]不为0的情况下,a[i]与b[i]对应相等时, 并且数组a满足九宫幻方的特点时,计数次数cnt +1,并把a[]保存到结果数组result[]中。 注意:由于此处只用到了数组中的部分数字,所以需要考虑对局面进行判重,但是考虑到本题的实际情况,所以并不需要判重。
1 #include<iostream> 2 #include<cstring> 3 #include<algorithm> 4 5 using namespace std; 6 7 int a[9] = {1,2,3,4,5,6,7,8,9}; // 进行枚举的全排列数组 8 int b[9]; // 一开始输入的3×3数组 9 int result[9]; // 保存结果的数组 10 11 int main() 12 { 13 for(int i = 0; i < 9; ++i) 14 cin >> b[i]; 15 16 int cnt = 0; 17 do 18 { 19 int flag = 1; 20 for(int i = 0; i < 9; ++i) 21 { 22 if(b[i] != 0) 23 { 24 if(a[i] != b[i]) 25 { 26 flag = 0; 27 break; 28 } 29 } 30 } 31 32 if(flag == 0) 33 continue; 34 else 35 { 36 int sum1 = a[0] + a[1] + a[2]; 37 int sum2 = a[0] + a[3] + a[6]; 38 int sum3 = a[6] + a[7] + a[8]; 39 int sum4 = a[2] + a[5] + a[8]; 40 int sum5 = a[0] + a[4] + a[8]; 41 int sum6 = a[2] + a[4] + a[6]; 42 if(sum1 == sum2 && sum2 == sum3 && sum3 == sum4 && sum4 == sum5 && sum5 == sum6) 43 { 44 memcpy(result, a,sizeof(a)); 45 cnt++; 46 } 47 } 48 49 }while(next_permutation(a,a+9)); 50 51 if(cnt == 1) 52 { 53 for(int i = 0; i < 9; ++i) 54 { 55 if(i % 3 == 2) 56 cout << result[i] << endl; 57 else 58 cout << result[i] << ' '; 59 } 60 } 61 else 62 cout << "Too Many" << endl; 63 64 return 0; 65 }
标签:cnt,&&,int,幻方,三阶,蓝桥,枚举,数组 来源: https://www.cnblogs.com/FengZeng666/p/10576303.html