趣味编程之九宫矩阵

题目描述:

将1-9这九个数字排成三行三列,使其行列、对角线上三数之和均相同,试编程求所有的可能;

#include <iostream>
using namespace std;
int a[3][3], b[3][3];
int main()
{
    int i, tx, ty;
    int x = 0, y = 1;
    a[0][1] = 1;                 //将1放在第0行第1列
    for (i = 2; i <= 9; i++)
    {
        tx = (x + 2) % 3;
        ty = (y + 1) % 3;
        if (a[tx][ty] == 0)                 //如果斜上方未填数字
        {
            a[tx][ty] = i;              //x为行,y为列
            x = tx;
            y = ty;
        }
        else                                //否则填数到下方
        {
            x = (x + 1) % 3;
            a[x][y] = i;
        }
    }
    for (i = 0; i <= 3; ++i)
    {
        cout << a[0][0] << a[0][1] << a[0][2] << endl;
        cout << a[1][0] << a[1][1] << a[1][2] << endl;
        cout << a[2][0] << a[2][1] << a[2][2] << endl;
        cout << endl;
        cout << a[2][0] << a[2][1] << a[2][2] << endl;     //上下翻转
        cout << a[1][0] << a[1][1] << a[1][2] << endl;
        cout << a[0][0] << a[0][1] << a[0][2] << endl;
        cout << endl;
        for (int m = 0; m < 3; ++m)                         //借助辅助数组b进行翻转
            for (int n = 0; n < 3; ++n)
                b[n][2 - m] = a[m][n];
        for (int m = 0; m < 3; ++m)
            for (int n = 0; n < 3; ++n)
                a[m][n] = b[m][n];
    }
    return 0;
}

运行结果:

问题分析:

根据奇偶性质,满足题目要求的情况其实只有一种,四个角为偶数,其余五个空为奇数。

而偶数2,4,6,8这四个数,正好占据了矩形的四个角,以其中一个答案为例子;

填充规律是:把这个九宫格的边界看做和贪吃蛇一样吧,从一边出去从另一边对应的位置进来;

在第一行中间填1,然后向1的右上方走,到达到数值2的位置,依次类推,一直到碰到已经填的数字为止,此时数字向下走一步,然后继续向右上方走

当所有格字填满后,将这个九宫格翻转或者 镜像就能得到其它的情况。

心得:

这是我在一本C语言的书上看到的题目,然后按照它的代码改编的,正好我们刚刚开始学二维数组,一下子对二维数组的理解增加了不少。

时间: 2024-08-07 19:44:34

趣味编程之九宫矩阵的相关文章

趣味编程:静夜思(Java8版)

import java.util.stream.*; class KV { String ch; int id; } public class Test { private static void print(String text, int offset) { IntStream.range(0, text.length()) .mapToObj(i -> new KV(){{ch = text.substring(i, i + 1); id = i;}}) .collect(Collecto

【CUDA并行编程之四】矩阵相乘

前面介绍了基本的Cuda编程的相关知识,那么这一篇在此基础之上来看看GPU在处理数据计算上的高效能,我们拿矩阵相乘来作为例子. 1.CPU上执行矩阵相乘以及性能. 在CPU上进行矩阵相乘运算的代码: mat_mul.cc: <span style="font-family:Microsoft YaHei;font-size:18px;">//a[i]*b[i] + c[i] = d[i] #include<iostream> #include<vector

C++面向对象编程解决三阶矩阵相加减

/*此处用面向对象编程*/ #include<iostream> #include<string.h> using namespace std; class Matrices { private: int mat[3][3]; public: Matrices(); void input() { for(int i=0; i<3; i++) { for(int j=0; j<3; j++) { cin>>mat[i][j]; } } } friend Mat

ACM编程题之矩阵翻转

题目: 晓萌最近在做一个翻转图片的应用,你可能也知道,图片其实是由一个个的点组成的. 于是,晓萌想先做一个可以翻转矩阵的程序,来解决他问题的核心部分. 输入第一行包括由空格分开的整数M.N.T(0<M<200,0<N<200,T=0或1), 其中M和N分别表示待处理矩阵的行数与列数,T为0时表示左右翻转,为1时表示上下翻转. 之后的M行,每行包括由空格分隔的N个整数,依次为输入矩阵的每一行的数据. 输出包括M行N列,每个数字之间用一个空格分隔,表示的是按照要求翻转后的矩阵. 样例输

Java-基础编程(螺旋矩阵&amp;乘法表)

package cn.rick.study; import java.io.BufferedReader;import java.io.InputStreamReader;import java.util.Scanner; /** * * @author Rick-bao date 2014-8-29 * */public class SomeBasicCode { public static void main(String[] args) { MultiplicationTable();//

C语言趣味编程两小例

(1)5位运动员参加了10米台跳水比赛,有人让他们预测比赛结果 A选手说:B第一,我第三. B选手说:我第二,E第四. C选手说:我第一,D第二. D选手说:C最后,我第三. E选手说:我第四,A第一. 比赛结束后,每位选手都说对了一半,请编程确定比赛的名次. #include <stdio.h> int main() {    int a = 0, b = 0, c = 0, d = 0, e = 0;    for (a = 1; a <= 5; a++)   {       for

青少年趣味编程学习班

一.魔抓Scratch创意编程班 适合对象:小学或初中8-16岁小朋友 班级设置:互动教学,小班授课(3-10人) 学习方式:每周一次,每次2小时. 序 号 班 别 主 要 学 习 内 容 学 时 学 费 1. Scratch 入门班 适合8-10岁的小朋友学习 18次 1800元 2. Scratch创意设计班 适合10-12岁的小朋友学习 18次 2160元 3. Scratch 高级班 适合12-16岁的小朋友学习 18次 2160元 (1). Scratch适合哪个年龄段的人群使用? S

GEEK编程练习— —zigzag矩阵

题目 输入矩阵规模N,输出zigzag矩阵. zigzag顺序为下图所示 输入 5 输出 0 1 5 6 14 2 4 7 13 15 3 8 12 16 21 9 11 17 20 22 10 18 19 23 24 解析1 此方法是计算顺序位置的对应元素值. 假定i为行数,j为列数,每一条斜线下标(i+j)为常数,记为s(s=i+j). 处理分为上三角和下三角两部分处理. 对于上三角,每一个斜线上的元素个数比上一斜线多一个,每个斜线上的第一个元素表示了该斜线之前元素的个数.运用等差数列求和公

趣味编程:静夜思(Haskell版)

-- jys.hs import Data.Map (fromListWith, toAscList) import Data.List (intersperse) (|>) x f = f x sortAndGroup kv = fromListWith (++) [(k, [v]) | (k, v) <- kv] sortAndGroupBy f xs = sortAndGroup $ zip (map f xs) xs verticalWriting text offset = zip