您的位置:首页 > 其它

蛇形矩阵:对上一种方法的改进

2009-12-29 20:07 253 查看
所关注的地方:每一个斜行第一个被填入的下标(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();
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: