蛇形填数字 (附书上例题答案)

题目来自刘汝佳编著的《算法竞赛入门经典(第二版)》

题目描述:

在 n*n 方阵中填入 1, 2, 3, ..., n*n 要求填成蛇形。 例如, n = 4 时方阵为:

10  11  12  1

9   16  13  2

8   15  14  3

7     6    5  4

我的代码(C++):

#include<iostream>
using namespace std;
int main(){
    int n, i, j, m, time, t;
    int a[20][20];
    cin >> n;
    m = 1;
    i = 0;
    j = n-1;
    time = n*n;
    t = n;
    while (m <= time)
    {
        while (i <= n - 1) {
            a[i][j] = m;
            m++;
            i++;
        }

        i--;
        j--;
        while (j >= t-n) {
            a[i][j] = m;
            m++;
            j--;
        }

        j++;
        i--;
        while (i >= t-n) {
            a[i][j] = m;
            m++;
            i--;
        }

        i++;
        n--;
        j++;
        while (j <= n - 1) {
            a[i][j] = m;
            m++;
            j++;
        }

        j--;
        i++;
    }
    for (i = 0; i < t; i++)
    {
        for (j = 0; j < t; j++)
        {
            cout << a[i][j] << "     ";
            if (j == t - 1) cout << endl;
        }
    }
    return 0;
}

答案的代码(C):

#include<stdio.h>
#include<string.h>
#define maxn 20
int a[maxn][maxn];
int main() {
    int n, x, y, tot = 0;
    scanf("%d", &n);
    memset(a, 0, sizeof(a));
    tot = a[x = 0][y = n - 1] = 1;
    while (tot < n*n);
    {
        while (x + 1 < n && !a[x + 1][y]) a[++x][y] = ++tot;
        while (y - 1 >= 0 && !a[x][y - 1]) a[x][--y] = ++tot;
        while (x - 1 >= 0 && !a[x - 1][y]) a[--x][y] = ++tot;
        while (y + 1 < n && !a[x][y + 1]) a[x][++y] = ++tot;
    }
    for (x = 0; x < n; x++) {
        for (y = 0; y < n; y++)
            printf("%3d", a[x][y]);
        printf("\n");
    }
    return 0;
}

如果哪位大神有更加厉害的算法,请不要吝啬哦~o(* ̄▽ ̄*)ブ

时间: 2024-10-10 23:51:43

蛇形填数字 (附书上例题答案)的相关文章

一个C++程序(书上例题)

#include<iostream>using namespace std;class Student{private:int num;int score;public:void setdate(){cin>>num;cin>>score;}void display(){cout<<"num="<<num<<endl;cout<<"score="<<score<&l

Java 初学 第一弹--编译并运行书上的简单程序(猜数字小游戏)

(博主原创) 首先说明一下,博主是大一上学期结束寒假时自己看的Java,然后我看的是Head First Java的中文版,因为大一学了c,所以里面的一些基本思想还是了解的,在看这本书时就浏览了一下(就是那种光看没有自己动手去敲代码的),然后看到书上的一个猜数字小游戏,就想手动敲一下,熟悉熟悉Java的语法,但是真正去做时,发现比看起来要困难一些. 首先是Java在建立一个源码文件之前要先建一个package,然后我用的Eclipse写的Java(感觉和pycharm风格差不多),再新建一个文件

nyoj 852 蛇形填数(二)【循环+数组】

蛇形填数(二) 时间限制:2000 ms  |  内存限制:65535 KB 难度:3 描述 1 2 3 4 5 12 13 14 6 11 15 7 10 8 9 跟蛇形填数一样,只是填数要求按照三角形填.注意每组数据之间用空行隔开 输入 第一行有一个N,表示N组测试数据 接下来每组数据包括一个数字X,表示三角形的边长,0< X <1000 输出 输出之后填好之后的图 样例输入 2 5 4 样例输出 1 2 3 4 5 12 13 14 6 11 15 7 10 8 9 1 2 3 4 9

每日一练第7天:蛇形填数

蛇形填数.在n×n方阵里填入1,2,...,n×n,要求填成蛇形. 例如,n=4时方阵为: 10 11 12  1 9 16 13  2 8 15 14  3 7   6   5  4 解决此题的一个重要原则就是先判断下一个要填的位置是否满足条件,再填数.不是发现了不能填再退回来. 代码如下: 1 #include <stdio.h> 2 #include <string.h> 3 #define MAXN 100 4 int matrix[MAXN][MAXN]; 5 6 int

python版蛇形填数

引 入 蛇形填数,一道经典有趣的算法入门题.这里用python来实现. 代码 vim snake.py #!/usr/bin/env python #-*- coding: utf-8 -*- #矩阵初始化函数 def genMatrix(rows,cols):       #用二维数组来代表矩阵     matrix = [[0 for col in range(cols)] for row in range(rows)]       for i in range(rows):        

模仿之中也少不了创新——Leo鉴书上65

模仿不就是抄吗?这也需要创新? 答案是:不但需要,而且非常需要.<模仿的力量>从独特的角度全市了模仿的概念以及成功和失败的应用,还有就是如何才能成功模仿让好东西为我们所用,我理解--只有在充分理解原型的前提下.准确解码.加以足够的创新模仿才可能真正成功,才可能为大家带来价值. 书里给我印象最深的要算竞争者模仿西南航空的例子(从56页开始,后面多少都有涉及),有些竞争都模仿之后走向了衰亡,而有些竞争者模仿西南看航空之后让自己赢得了新的生命力."疯狂降低成本,节约.节约.再节约!&quo

ACM/ICPC 之 DP进阶(51Nod-1371(填数字))

原题链接:填数字 顺便推荐一下,偶然看到这个OJ,发现社区运营做得很赞,而且交互和编译环境都很赞(可以编译包括Python,Ruby,Js在内的脚本语言,也可以编译新标准的C/C++11,甚至包括Go和C Sharp等),虽然暂时不太火,但估计会逐渐成为国内算法界非常受欢迎的OJ社区. 主页:http://www.51nod.com/index.html 本题是个题意简单的,思路复杂的DP题,说实话,光是想出这种DP就已经非常不易了,即便写出来也要考虑清楚每一种转移的公式和数值关系. 原题:有n

[算法竞赛入门]蛇形填数

蛇形填数.在n×n方阵里填入1,2,-,n×n,要求填成蛇形.例如,n=4时方阵为:10 11 12 19 16 13 28 15 14 37 6 5 4上面的方阵中,多余的空格只是为了便于观察规律,不必严格输出.n≤8. [解析]这道题的解题思路主要还是在于如何模拟蛇形填数的过程. 我们给出两个概念的定义: (1)方向:该题中的方向顺序为"下-左-上-右" (2)墙:填数过程中若遇到墙,则应改变方向. [一种实现思路]注:这里我将n*n矩阵广义为n*m矩阵,令m=n. #includ

黑书贪心例题之钓鱼 poj1042:Gone Fishing

总时间限制: 2000ms 内存限制: 65536kB 描述 John is going on a fishing trip. He has h hours available (1 <= h <= 16), and there are n lakes in the area (2 <= n <= 25) all reachable along a single, one-way road. John starts at lake 1, but he can finish at a