c语言简单编程

Input array size N (1~20)
Using Two-Dimensional array
输入数组大小氮(1 - 20)
二维数组![图片说明](https://img-ask.csdn.net/upload/201511/06/1446819387_646558.png)图片说明

楼上站着说话不腰疼。
这道题只给思路,但是你那个最关键的思路就没给。
我以为自己十分钟可以搞定这题,结果弄了一个小时。。。
给出经过测试的C语言源码如下:

 #include "stdio.h"
#include "stdlib.h"
#define NUM 5

void right_add(int a[NUM][NUM],int line,int row,int count); //Note that it can't be written as a[][] here(with an error called "Without subscript")
void down_add(int a[NUM][NUM],int line,int row,int count);
void left_add(int a[NUM][NUM],int line,int row,int count);
void up_add(int a[NUM][NUM],int line,int row,int count);
void print(int a[NUM][NUM],int n);


int main(int argc, char* argv[])
{
    int i,j;
    int result[NUM][NUM];
    for(i = 0;i < NUM;i++)
        for(j = 0;j < NUM;j++)
            result[i][j] = 0;

    int num = NUM * NUM;
    right_add(result,0,0,1);   //The first move is always towards right

    return 0;
}

void right_add(int a[NUM][NUM],int line,int row,int count) {  //Move to right position until there are limits
    while(a[line][row] == 0) {
        a[line][row] = count;
        count++;
        if (count > NUM*NUM) {
            print(a,NUM);
            exit(0);
        }
        row++;

        if(row % NUM == 0 || a[line][row] != 0) { //When it reaches the border or its right is a valid number,goto down_add
            row--;
            line++;
            down_add(a,line,row,count);
        }
    }
}

void down_add(int a[NUM][NUM],int line,int row,int count) { //Move to downside position until there are limits
    while(a[line][row] == 0) {
        a[line][row] = count;
        count++;
        if (count > NUM*NUM) {
            print(a,NUM);
            exit(0);
        }
        line++;

        if(line % NUM == 0 || a[line][row] != 0) { //When it reaches the border or its downside is a valid number,goto left_add
            line--;
            row--;
            left_add(a,line,row,count);
        }
    }
}

void left_add(int a[NUM][NUM],int line,int row,int count) { //Move to left position until there are limits
    while(a[line][row] == 0) {
        a[line][row] = count;
        count++;
        if (count > NUM*NUM) {
            print(a,NUM);
            exit(0);
        }
        row--;

        if(row == -1 || a[line][row] != 0) { //When it reaches the border or its left is a valid number,goto up_add
            row++;
            line--;
            up_add(a,line,row,count);
        }
    }
}

void up_add(int a[NUM][NUM],int line,int row,int count) { //Move to upside position until there are limits
    while(a[line][row] == 0) {
        a[line][row] = count;
        count++;
        if (count > NUM*NUM) {
            print(a,NUM);
            exit(0);
        }
        line--;

        if(line == -1 || a[line][row] != 0) { //When it reaches the border or its left is a valid number,goto up_add
            line++;
            row++;
            right_add(a,line,row,count);
        }
    }
}

void print(int a[NUM][NUM],int n) { //Print out the result we get
    int i,j;
    for(i = 0;i < n;i++) {
        for(j = 0;j < n;j++) {
            printf("%3d",a[i][j]);   //Formatting the output
            if ((j+1) % n == 0)      //goto next line
                printf("\n");
        }
    }
}

测试结果:
图片说明
图片说明
图片说明
再放个大招:
图片说明

附:当规模大了以后,print函数的格式化输出需要调整一下。
题主看看程序思路,如果哪里不理解欢迎继续交流,我打算把它写到我的博客里了~
当然,这个代码是可以优化的,我到时再用指针重写一遍~

图片说明

图在评论这里。不好意思

这个是我多年前上学的时候写过的一个题目,只给思路。不给源码。用动态分配二维数组,然后for循环控制赋值(也没啥难度,按照规律写就行),然后打印数组就行。当前上学的时候,在这道
题目上纠结过,一直想改怎么打印(想直接循环打印),后来一想还不如弄个数组,循环赋值到数组里,再打印不就完了。

挺有意思。

 #include <stdio.h>
int main()
{
    int a[100][100],num,count,i,j,k,kend,lend;
    printf("Input a number: ");
    scanf("%d",&num);

    kend=num/2;
    lend=num;
    count=1;
    for( i=0,j=0,k=0; k<kend; k++ )
    {
        a[i][j]=count++;

        for(j++;j<lend;j++)
            a[i][j]=count++;

        for(i++,j--;i<lend;i++)
            a[i][j]=count++;

        for(i--,j--;j>=k;j--)
            a[i][j]=count++;

        for(i--,j++;i>k;i--)
            a[i][j]=count++;

        i++;j++;lend--;
    }
    if(num%2 != 0) a[i][j]=count;
    for( i=0; i<num; i++ )
    {
        for( j=0; j<num; j++ )
            printf("%4d ",a[i][j]);
        printf("\n");
    }
}

另写了一个动态数组版,放到我的博客里了。
欢迎参考。
练习

对一个矩阵,我们注意到可以将它分为一个套一个的环,如一个矩阵:

                        1      2      3      4

                        5      6      7      8

                        9      10    11    12

                        13    14    15    16

最外面一个环为: 

                        1      2      3      4

                        5                      8

                        9                     12

                        13    14    15    16

角标记为(start,start), 最外面一还的右上角的角标为(0,0),然后往内一个环的右上角角标为:(1,1),以此类推。

我们发现,对一个5*5的矩阵,最内环角标为(2,2),而5>2*2;对于6*6的矩阵,最内环角标为(2,2),同样6>2*2。所以,可以看出,只要raw>startY*2 and column>startX*2即说明还有环未打印完,需要继续打印,否则打印结束,所以我们先用一个函数printMatrixCircle()来做这个大循环。然后在设计一个函数printOneCircle()来打印一个环。
 #include<stdio.h>
#include<stdlib.h>

void printOneCircle(int **matrix, int raw, int column, int start)
    //打印一个环
{
    int tempRaw = raw - start, tempColumn = column - start;
    //tempRaw表示此环的行边界,tempColumn表示此环的列边界
    int i = 0, j = 0;
    for(i=start; i<=tempColumn; i++)//打印第一行
        printf("%d ", matrix[start][i]);
    if(start < tempRaw)//如果多于一行,打印最后一列
    {
        for(i=start+1; i<=tempRaw; i++)
            printf("%d ", matrix[i][tempColumn]);
    }
    if(start < tempRaw && start < tempColumn)//如果多于一行且多于一列,打印最后一列
    {
        for(i=tempColumn-1; i>=start; i--)
            printf("%d ", matrix[tempRaw][i]);
    }
    if(start < tempRaw-1 && start < tempColumn)//如果多于两行且多于一列,打印
        for(i=tempRaw-1; i>start; i--)
            printf("%d ", matrix[i][start]);
    return;
}

void printMatrixInCircle(int **matrix, int raw, int column)
{
    if(matrix == NULL || raw < 0 || column < 0)
        return;
    int start = 0;
    while(raw > start * 2 && column > start * 2)//做循环打印,并内缩环
    {
        printOneCircle(matrix, raw - 1, column - 1, start);
        ++start;
    }
    putchar('\n');
    return;
}

int main(void)
{
    int raw = 0, column = 0;
    int **matrix = NULL;
    printf("Please input number of raw and column:\n");
    scanf("%d", &raw);
    scanf("%d", &column);
    int i = 0, j = 0;
    //生成二维数组
    if(! (matrix = (int**)malloc(sizeof(int*) * raw)))
    {
        printf("Bad alloc!!\n");
        return -1;
    }
    while(i < raw)
        if(! (matrix[i++] = (int*)malloc(sizeof(int) * column)))
        {
            printf("Bad alloc!!\n");
            return -1;
        }
    printf("Please input the matrix:\n");
    for(i=0; i<raw; i++,j)
        for(j=0; j<column; j++)
            scanf("%d", &matrix[i][j]);
    printf("The result is:");
    printMatrixInCircle(matrix, raw, column);
    for(i = 0; i<=raw-1; i++)
        free(matrix[i]);
    free(matrix);
    return 0;
}

http://my.oschina.net/u/1584433/blog/226571

这题就是看你怎么思考问题,如果你注意到一个个环,注意控制下边界问题