Input array size N (1~20)
Using Two-Dimensional array
输入数组大小氮(1 - 20)
二维数组
楼上站着说话不腰疼。
这道题只给思路,但是你那个最关键的思路就没给。
我以为自己十分钟可以搞定这题,结果弄了一个小时。。。
给出经过测试的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
这题就是看你怎么思考问题,如果你注意到一个个环,注意控制下边界问题