题目详情:
peter喜欢玩数字游戏,但数独这样的游戏对他来说太简单了,于是他准备玩一个难的游戏。游戏规则是在一个N*N的表格里填数,规则:对于每个输入的N,从左上角开始,总是以对角线为起点,先横着填,再竖着填。这里给了一些样例,请在样例中找到规律并把这个N*N的表格打印出来吧。
输入描述:
多组测试数据(数据量在100组以内)。每组测试数据只有一行为一个整数N(1<=N<=30),表示表格的大小。
输出描述:
对于每组输入数据,输出N行,为填完的表格(N行,每行N个整数,每个数字之间用空格隔开。
答题说明:
输入样例:
3
5
输出样例:
1 2 3
4 6 7
5 8 9
1 2 3 4 5
6 10 11 12 13
7 14 17 18 19
8 15 20 22 23
9 16 21 24 25
解析:这道题很简单,只要能将问题拆分成若干个子问题就ok了,由题目可知,可以将问题分成两个子问题:1、横向填数字;2、纵向填数字;
- 当横向填充数字的时候,那么就将行数加1,即准备向下一行填充数字。
- 当纵向填充数字的时候,那么就将列数加1,即准备向下一列填充数字。
程序如下:
#include<stdio.h>
int r[31][31],N,num=1;
int insertCol(int row,int col)
{
int i;
for(i=col-1;i<N;i++)
{
r[row-1][i]=num++;
}
}
int insertRow(int row,int col)
{
int i;
for(i=row-1;i<N;i++)
{
r[i][col-1]=num++;
}
}
int main()
{
int Max,row,col,i,j,b=1;
while(scanf("%d",&N)==1)
{
b=1;
row=1;
col=1;
num=1;
Max=N*N;
while(Max>=num)
{
if(b==1)
{
insertCol(row,col);
row++;
}
else
{
insertRow(row,col);
col++;
}
b=1-b;
}
for(i=0;i<N;i++)
{
for(j=0;j<N;j++)
{
printf("%d",r[i][j]);
if(j<N-1)
{
printf(" ");
}
}
printf("\n");
}
}
return 0;
}