n=5:
1 2 9 10 25
4 3 8 11 24
5 6 7 12 23
16 15 14 13 22
17 18 19 20 21
n=6:
1 2 9 10 25 26
4 3 8 11 24 27
5 6 7 12 23 28
16 15 14 13 22 29
17 18 19 20 21 30
36 35 34 33 32 31
这种题目就是找规律,无非就是你花多长时间找出来而已。
我们假设下标为(i,j),i,j都从1开始,规律如下(比较懒,推倒过程省去):
当i>=j时
如果i为偶数:number[i][j] = i*i + 1 - j;
如果i为奇数:number[i][j] = (i-1)*(i-1) + j;
当j>=i时,
如果j为偶数:number[i][j] = (j-1)*(j-1) + i;
如果j为奇数:number[i][j] = j*j + 1 - i;
代码如下:
#include<stdio.h>
void printMatrix(int n);
int main()
{
printMatrix(5);
system("pause");
return 0;
}
void printMatrix(int n){
if(n < 1)
return;
else{
int i ,j;
for(i = 1;i <=n;i++){
for(j = 1;j <= n;j++){
int num;
if(j > i){
if(j%2)
num = j*j + 1 -i;
else
num = (j-1)*(j-1)+i;
printf("%d ",num);
}else{
if(i%2)
num = (i-1)*(i-1)+j;
else
num = i*i + 1 - j;
printf("%d ",num);
}
}
printf("\n");
}
}
}
2、36匹马赛跑,跑道同时只能容许6匹马。而且36匹马速度不同,但是每次跑的速度恒定。
问,跑多少次可以选出第一,第二,第三名。
分析:
第一步,我们将36匹马分成6支队伍,编号如下:
A1,A2,...,A6;
B1,B2,...,B6;
C1,C2,...,C6;
D1,D2,...,D6;
E1,E2,...,E6;
F1,F2,...,F6;
每支队伍单独跑一次,这样总共跑了6次。我们假设跑完的排名和上面的顺序是一样的(这个对结果无影响)。
第二步,让每支队伍的第一名在一起跑,取前三名,我们假设是A1,B1和C1.那么A1肯定是整体的第一名,下面只剩下第二和第三两匹马了。
第三步,有可能成为第二名和第三名的马的数量是有限的,基于第一和第二步,我们可以推出可能成为第二和第三名的马有A2,A3,B1,B2,C1,一共五匹。让这五匹马一起跑,选出前两名,就分别是整体的第二和第三名。
总结:第一步,跑了6次;第二步,跑了1次;第三步,跑了1次,一共8次。