09-语言入门-09-蛇形填数

题目地址:?http://acm.nyist.net/JudgeOnline/problem.php?pid=33?

?

描述
在n*n方陈里填入1,2,...,n*n,要求填成蛇形。例如n=4时方陈为:
10 11 12 1
9 16 13 2
8 15 14 3
7 6 5 4

输入
直接输入方陈的维数,即n的值。(n<=100)

输出
输出结果是蛇形方阵。

样例输入
3

样例输出
7 8 1
6 9 2
5 4 3

?

#include <stdio.h>
#include <stdlib.h>

static void setArr(int **arr,int readNum);
static void printArr(int **arr,int num);

int main()
{
???? int readNum = 0;
???? scanf("%d",&readNum);
???? getchar();
????
???? int **arr = (int**)malloc(sizeof(int*)*readNum);
???? int rowIndex = 0;
???? for(;rowIndex < readNum;++rowIndex)
???? {
????????? arr[rowIndex] = (int*)malloc(sizeof(int)*readNum);
???? }
????
???? setArr(arr,readNum);
???? printArr(arr,readNum);
?????????
???? rowIndex = 0;
???? for(;rowIndex < readNum;++rowIndex)
???? {
????????? free(arr[rowIndex]);
???? }
???? free(arr);
????
????
???? return 0;
}

static void setArr(int **arr,int readNum)
{
???? int i=0;
???? int flag = readNum;
???? int colIndex = readNum-1;
???? int rowIndex = 0;
???? int maxNum = readNum*readNum;
???? while(i<maxNum) //如果是偶数,则最大一个值在上侧执行完毕后就结束了
???? {
????????? colIndex = flag-1;
?????????
????????? if(i == maxNum-1) //如果是奇数方阵,则最后一个数是最后一个最大值,特殊处理后结束
????????? {
?????????????? arr[rowIndex][colIndex] = ++i;
?????????????? break;
????????? }
?????????
????????? //右侧,行+,列不变
????????? for(;rowIndex<flag-1 && i<=maxNum;++rowIndex)
????????? {
?????????????? arr[rowIndex][colIndex] = ++i;
????????? }
?????????
????????? //下侧,行不变 列-
????????? for(;colIndex>readNum-flag && i<=maxNum;--colIndex)
????????? {
?????????????? arr[rowIndex][colIndex] = ++i;
????????? }
?????????
????????? //左侧,行-,列不变
????????? for(;rowIndex>readNum-flag && i<=maxNum;--rowIndex)
????????? {
?????????????? arr[rowIndex][colIndex] = ++i;
????????? }
?????????
????????? //上侧,行不变,列++
????????? for(;colIndex<flag-1 && i<=maxNum;++colIndex)
????????? {
?????????????? arr[rowIndex][colIndex] = ++i;
????????? }
?????????
????????? --flag;
????????? ++rowIndex;
???? }
}

static void printArr(int **arr,int num)
{
???? int???? rowIndex = 0;
???? for(;rowIndex<num;++rowIndex)
???? {
????????? int colIndex = 0;
????????? for(;colIndex < num;++colIndex)
????????? {
?????????????? printf("%d ",arr[rowIndex][colIndex]);
????????? }
????????? printf("\n");
???? }
}

时间: 2024-08-01 00:45:47

09-语言入门-09-蛇形填数的相关文章

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

蛇形填数.在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

&lt;蛇形填数&gt;--算法竞赛 入门经典(第2版)- 3.1 数组 程序3-3 蛇形填数

 蛇形填数: 在n×n方阵里填入1,2,....,n×n,要求填成蛇形.例如,n = 4 时方阵为:   10  11  12  1   9  16  13  2 8  15  14  3 7   6    5   4 上面的方阵中,多余的空格只是为了便于观察规律,不必严格输出.n <= 8 . 类比上面这种数学中的矩阵,我们可以考虑使用一个二维数组来储存. 解题思路:从右上角开始往下填数,当到底的时候转向左填值,当到左边的边的时候转向上填数,当到最上面的时候转向右填值...依次类推.第一轮转圈

【C语言】蛇形填数

1 #include<string.h> 2 #define maxn 20 3 int a[maxn][maxn]; 4 int main() 5 { 6 int n,x,y,tot = 0; 7 scanf("%d",&n); 8 memset(a,0,sizeof(a)); 9 tot = a[x=0][y=n-1] = 1; 10 while(tot < n*n) 11 { 12 while(x+1<n && ! a[x+1][y

&lt;蛇形填数&gt;--算法竞赛 入门经典(第2版) 程序3-3 蛇形填数

蛇形填数: 在n×n方阵里填入1,2,....,n×n,要求填成蛇形.例如,n = 4 时方阵为:   10  11  12  1   9  16  13  2 8  15  14  3 7   6   5  4 上面的方阵中,多余的空格只是为了便于观察规律,不必严格输出.n <= 8 . 类比上面这种数学中的矩阵,我们可以考虑使用一个二维数组来储存. 解题思路:从右上角开始往下填数,当到底的时候转向左填值,当到左边的边的时候转向上填数,当到最上面的时候转向右填值...依次类推.第一轮转圈的判断

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):        

NYOJ33 蛇形填数

一.原题 在n*n方阵里填入1,2,...,n*n.要求填成蛇形.例如n=4时方阵为: 10  11  12  1 9  16  13  2 8  15  14  3 7    6    5  4 (题目来源:<算法竞赛入门经典>[刘汝佳]) 二.题目源代码 #include <stdio.h> #include <string.h> #define MAXN 10 int a[MAXN][MAXN]; int main() { int n,x,y,tot=0; sca

梦工厂实验室 蛇形填数 dfs

问题 D: 蛇形填数 时间限制: 3 Sec  内存限制: 64 MB提交: 28  解决: 5[提交][状态][讨论版] 题目描述 在n*n方阵里填入1,2,...,n*n,要求填成蛇形.例如n=4时方阵为:10 11 12 19 16 13 28 15 14 37 6 5 4 输入 直接输入方阵的维数,即n的值.(n<=100) 输出 输出结果是蛇形方阵. 样例输入 3 样例输出 7 8 1 6 9 2 5 4 3 一类题型.四个方向dfs,当走不通时,t++改变方向,否则一直往一个方向走.

【基础题】蛇形填数

题目描述 在n*n方陈里填入1,2,...,n*n,要求填成蛇形.例如n=4时方陈为: 10 11 12 1 9 16 13 2 8 15 14 3 7 6 5 4 输入 直接输入方阵的维数,即n的值.(n<=100) 输出 输出结果是蛇形方陈. 样例输入 3 样例输出 7 8 1 6 9 2 5 4 3 先说一下我的思路,我把n=4时的情况列了出来,发现了奇数时,j变化,偶数时,i变化等变化规律,后来我发现需要总结很多变化规律才能算数来,总结出了n=4的,n=5时又不一样了,哎,头疼(小白的思

每日一练第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

nyoj 33 蛇形填数

蛇形填数 时间限制:3000 ms  |            内存限制:65535 KB 难度:3 描述 在n*n方陈里填入1,2,...,n*n,要求填成蛇形.例如n=4时方陈为: 10 11 12 1 9 16 13 2 8 15 14 3 7  6  5 4 输入 直接输入方陈的维数,即n的值.(n<=100) 输出 输出结果是蛇形方陈. 样例输入 3 样例输出 7 8 1 6 9 2 5 4 3 1 #include <iostream> 2 using namespace s