读书人

请问一个关于“蛇形矩阵”的算法

发布时间: 2012-03-21 13:33:15 作者: rapoo

请教一个关于“蛇形矩阵”的算法
生成一个按蛇形方式排列自然数1,2,3,4,5,……,N2的 (1 <N≤10)阶方阵。
例如:
输入: N=4 N=7
输出: 1 3 4 10 1 3 4 10 11 21 22
2 5 9 11 2 5 9 12 20 23 34
6 8 12 15 6 8 13 19 24 33 35
7 13 14 16 7 14 18 25 32 36 43
15 17 26 31 37 42 44
16 27 30 38 41 45 48
28 29 39 40 46 47 49

请高手指教一下,在循环中应该怎样确定输出数组中每个元素的值,谢谢!

[解决办法]
#include <iostream>

int main()
{
using std::cout;
using std::cin;
using std::endl;

int number;
cout < < "Enter a positive integer: ";
cin > > number;

int* arr = new int[number*number];

const int step[4][2] = { 0,1, 1,-1, 1,0, -1,1 };

arr[0] = 1;

for (int x =0,y = 0, state = 0, cur = 2; cur <= number*number; )
{
x += step[state][0];
y += step[state][1];

arr[y*number + x] = cur++;

switch (state)


{
case 0:// down
state = x == 0 ? 1 : 3;
break;
case 1: // right-up
if (y == 0 || x == number-1)
{
state = x == number-1 ? 0 : 2;
}
break;
case 2: // right
state = y == 0 ? 3 : 1;
break;
case 3: // left-down
if (x == 0 || y == number-1)
{
state = y == number-1 ? 2 : 0;
}
}
}

for (int y = 0; y < number; y++)
{
for (int x = 0; x < number; x++)
cout < < arr[y*number + x] < < "\t ";
cout < < endl;
}

delete [] arr;

system( "pause ");
}

最重要的是那个switch语句,四种状态之间的跳转。
[解决办法]
我总结出来了一个十分有趣的规律,
这样根据算法写出程序来应该很简单了
大家看,每行,每列的 增量 规律
1 3 4 10 11 21 22(原数据)
+ 2 1 6 1 10 1 14 1。。。(增量1和4)
3 1 3 8 3 12。。。 (增量3和4)
2 5 6 5 10 5。。。 (增量5和4)
7 4 7 8 7 12。。。 (增量7和4)
。 。 。 。 。 。
。 。 。 。 。 。
第一个数必然是1,那么一行一列的数就先确定好了
再根据怎两规律,就能写出没一行了。

1 + 1
2 + 4
6 + 1
7 + 4 * 2
15 + 1
16 + 4 * 3
28 + 1
29 + 4 * 4
[解决办法]
楼上的算法确实好,程序写出了也很简单。
#include <iostream>
#define MAX 16
using namespace std;
void main()
{
int c,c1,i,j,n,count,count1,array[MAX][MAX];
cout < < "请输入矩阵阶(0-15范围): ";
cin> > n;
for(int a=0;a <=n+1;a++)//初始化数组
for(int b=0;b <=n+1;b++)
array[a][b]=0;
array[1][1]=1;
array[n][n]=n*n;
for(c=0,count=0,i=2;i <=n;i++,c++)//初始化第一列
if(c%2==0)
{
array[i][1]=array[i-1][1]+1;
count++;
}
else
array[i][1]=array[i-1][1]+count*4;
for(c1=0,count1=0,j=n-1;j> 1;j--,c1++)//初始化最后一行,c用来计算列值变化
if(c1%2==0)
{
array[n][j]=array[n][j+1]-(count1*4+2);
count1++;
}
else
array[n][j]=array[n][j+1]-1;
for(i=n-1;i> =1;i--)//列1和行n已经赋值,现计算之外的部分即可
for(j=2;j <=n;j++)
if((i+j)%2==0)
array[i][j]=array[i+1][j-1]-1;
else
array[i][j]=array[i+1][j-1]+1;
for(i=1;i <=n;i++)//输出结果
{
for(j=1;j <=n;j++)
cout < <array[i][j] < < '\t ';
cout < <endl < <endl;
}
}

读书人网 >C++

热点推荐