所关注的地方:每一个斜行第一个被填入的下标(x,y)和相应数字
下面是对上一种处理方法的改进,不需要每次都去找对应的下标和数字,
而是事先都找出来。
貌似用的是动态规划?请高手指点。。
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <ctype.h>
#include <math.h>
void print_snake2(int n)
{
int m = 2*(n-1);
int *v = new int[m]; //保存每一个斜行第一个被填写的数字
int *posX = new int[m]; //保存每一个斜行第一个被填写下标的X值
int *posY = new int[m]; //保存每一个斜行第一个被填写下标的Y值
v[0] = 1;
posX[0]=0;
posY[0]=0;
//根据前一斜行计算下一斜行对应的v,posX值
for(int i = 1; i <n;i++)
{
v[i] = v[i-1]+((i-1)<=(n-1)?(i):((n<<1)-i));
if(i&1){posX[i]=posY[i-1]+1;posY[i]=posX[i-1];}
else {posX[i]=posY[(i)-1];posY[i]=posX[i-1]+1;}
}
//根据前一斜行计算下一斜行对应的v,posX值
for(int i=n; i<=m;i++)
{
v[i] = v[i-1]+((i-1)<=(n-1)?(i):((n<<1)-i));
if(posX[i-1]>posY[i-1])
{
posX[i]=posY[i-1]+1;
posY[i]=posX[i-1];
}
else
{
posX[i]=posY[i-1];
posY[i]=posX[i-1]+1;
}
}
//打印矩阵
for(int i = 0; i < n; i++)
{
for(int j = 0; j < n; j++)
{
printf("%4d ",v[i+j] + abs(i-posX[i+j]));
}
printf("/n");
}
}
void main()
{
int n = 0;
while(true)
{
scanf("%d",&n);
if(n<=0)break;
//getchar();
print_snake2(n);
}
getchar();
}