如下图所示,小络用从1 开始的正整数“蛇形”填充无限大的矩阵。容易看出矩阵第二行第二列中的数是5。请计算矩阵中第20 行第20 列的数是多少?
解题思路:
蛇形填数,观察可以发现当到达边界(蛇形边界)时,应判断它应该向右走还是向下走:
(1)如果是向右走完了就直接向左下走
(2)如果是向下走完了就直接向右上走
//蛇形填数
//C Code:
#include <stdio.h>
#include <stdlib.h>
int main()
{
int i = 0;
int j = 0;
int cnt = 2;//用来进行赋值
int a[250][250];
a[0][0] = 1;
while (cnt < 1000)
{
j++; //列+1,即向右走
//向左下走
while (i != -1 && j != -1)//等于-1表示此时已经到达边界
{
a[i][j] = cnt++;
if (j == 0)//到达边界
break;
i++;
j--;
}
i++; //行+1
//向右上走,即向左走
while (i != -1 && j != -1)//等于-1表示此时已经到达边界
{
a[i][j] = cnt++;
if (i == 0)//到达边界
break;
i--;
j++;
}
}
for (int i = 0; i < 20; i++)
{
for (int j = 0; j < 20; j++)
{
printf("%4d ",a[i][j]);
}
printf("\n");
}
printf("第20行20列的数:%d\n",a[19][19]);;//找出第20行20列的数
system("pause");
return 0;
}
//C++ Code:
#include <bits/stdc++.h>
using namespace std;
int main()
{
int i = 0;
int j = 0;
int cnt = 2;
int a[250][250];
a[0][0] = 1;
while (cnt < 1000)
{
j++;
while (i != -1 && j != -1)
{
a[i][j] = cnt++;
if (j == 0)
break;
i++;
j--;
}
i++;
while (i != -1 && j != -1)
{
a[i][j] = cnt++;
if (i == 0)
break;
i--;
j++;
}
}
for (int i = 0; i < 20; i++)
{
for (int j = 0; j < 20; j++)
{
cout << setw(5) << a[i][j] << ' ';
}
cout << '\n';
}
cout << a[19][19];//找出第20行20列的数
return 0;
}