首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

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

2012-03-21 
请教一个关于“蛇形矩阵”的算法生成一个按蛇形方式排列自然数1,2,3,4,5,……,N2的(1 N≤10)阶方阵。例如:输入:

请教一个关于“蛇形矩阵”的算法
生成一个按蛇形方式排列自然数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;
}
}

热点排行