蛇形方式存放数组问题

frankzch 2004-01-16 10:23:35
编写算法,一维数组A(元素个数为n×n)以蛇形方式存放于二维数组B中(n×n),示例如下:
A[1] A[2] A[6] A[7] ....
A[3] A[5] A[8] ....
A[4] A[9] ....
A[10] ...
....

...全文
342 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
theoldman 2004-01-25
  • 打赏
  • 举报
回复
我也给出一个程序(VC测试通过)
另:我在做成通式后发现如果要用计算机实现其的复杂度似乎相对比较糟,所以改做成下面的程序

#include "iostream.h"

const int N = 9 ;

void Put(int array1[], int array2[N][N], const bool flag=true)
{
int buffer,i,sum,count,length;
count = sum = 1 ;
length = N*N ;
for(buffer=i=0; i<length; i++)
{
if(count%2?flag:!flag) array2[sum-1-buffer][buffer] = array1[i] ;
else array2[buffer][sum-1-buffer] = array1[i] ;

if(++buffer==count+(sum>N ? sum%N : 0))
{
sum++ ;
buffer = sum>N ? sum%N : 0 ;
sum<=N ? count++ : count-- ;
}
}
}

void Display(const int array1[], const int array2[N][N])
{
int i,j ;
int length = N*N ;
for(i=0; i<length; i++)
cout << array1[i] << " " ;
cout << endl << endl ;

for(i=0; i<N; i++)
{
for(j=0; j<N; j++)
cout << array2[i][j] << " " ;
cout << endl ;
}
}

void main()
{
int i,array1[N*N] ;
int array2[N][N] = {0} ;

for(i=0; i<N*N; i++)
array1[i] = i+11 ; // 置一维数组初始值

Put(array1, array2) ; // 放置
Display(array1, array2) ; // 显示
}
xiaoyige886 2004-01-19
  • 打赏
  • 举报
回复
程序dev-c++ 通过!但没给出注释 @_@
慢慢看吧 !
xiaoyige886 2004-01-19
  • 打赏
  • 举报
回复
模拟坐标变换 ^_^

#include<stdio.h>
#include<stdlib.h>
#define N 15

int main()
{
int axy[4][2] = {{0,1},{1,-1},{1,0},{-1,1}};
int *map = new int[N*N];
int di=0,s=1,x=0,y=0,k=0,flag = 1,step=1,i;
for(i=1; i<=N*N; ++i)
{
map[x*N+y] = i;
if(i == N*(N+1)/2)
{
axy[0][0]= 1,axy[0][1]=0,
axy[2][0]= 0,axy[2][1]=1;
step = -1;
}
x += axy[di][0];
y += axy[di][1];

if(flag && (di==1 || di==3))
{
k = k+step;
s = k;
flag = 0;
}
if(!(--s))
{
di = (di+1)%4;
flag = 1;
continue;
}
if(flag) di = (di+1)%4;

}
for (i=1; i<=N*N; i++)
if (i%N==0)
printf("%3d\n",map[i-1]);
else
printf("%3d ",map[i-1]);
delete [] map;
system("pause");
return 0;
}
iwillwin 2004-01-17
  • 打赏
  • 举报
回复
sorry,没说清楚,如果是下半三角,就到着减回来就可以了,原理是一样的。只需要加一个判断,就是其值是不是大于n*(n+1)/2
gnefuil 2004-01-17
  • 打赏
  • 举报
回复
to iwillwin(生亦何欢死亦何苦)
没这么简单吧
那是个方阵,你的公式最多适合n*(n+1)/2个数,也就是左上方三角区域
后半个三角就不行了
iwillwin 2004-01-17
  • 打赏
  • 举报
回复
我来给个通式吧。二维数组的坐标为x,y,如果x+y-1为奇数,应当存储一维数组中标号为(x+y-2)*(x+y-1)/2+x位置的数,如果为偶数,应当存储标号为(x+y-2)*(x+y-1)/2+y位置的数。
weimj 2004-01-16
  • 打赏
  • 举报
回复
前面搞错了
j=k=0;
for(i=0;i<n*n;i++)
{
b[j,k]=a[i];
if((j+k)%2)
{
j--;
k++;
}
else
{
j++;
k--;
}
if(j==n)
{
j--;
k+=2;
}
if(k==n)
{
j+=2;
k--;
}
if(j<0)j=0;
if(k<0)k=0;
}
ZhangYv 2004-01-16
  • 打赏
  • 举报
回复
挺早以前有人也有人出一系列的这种题目,方法是:一种是用循环控制数组下标赋值,还有一种可以推出通式直接赋值
zzwu 2004-01-16
  • 打赏
  • 举报
回复
给200分,很吸引人.
weimj 2004-01-16
  • 打赏
  • 举报
回复
j=k=0;
for(i=0;i<n*n;i++)
{
b[j,k]=a[i];
if(k==n-1)
{
k=j+1;
j=n-1;
}
else if(j==0)
{
j=k+1;
k=0;
}
else
{
j--;
k++;
}
}
SimonSui 2004-01-16
  • 打赏
  • 举报
回复
不用公式,用迷宫式算法可以吗?
gnefuil 2004-01-16
  • 打赏
  • 举报
回复
递推公式:
按照c语言风格,0<=i<n 0<=j<n
当i+j<n时:
当i+j为奇数时:
b[i][j]=A[1+(i+j+2)*(i+j-1)/2+i+1]
当i+j为偶数时:
b[i][j]=A[(i+j+1)*(i+j)/2+j+1]
当i+j>=n时:
当n为奇数时:
当i+j-n+1为奇数时:
b[i][j]=A[n*(n+1)/2+(3*n-(i+j)-1)*(i+j-n)/2+n-j]
当i+j-n+1为偶数时:
b[i][j]=A[n*(n+1)/2+n-1+(3*n-(i+j)-2)*(i+j-n-1)/2+n-i]
当n为偶数时:
当i+j-n+1为奇数时:
b[i][j]=A[n*(n+1)/2+(3*n-(i+j)-1)*(i+j-n)/2+n-i]
当i+j-n+1为偶数时:
b[i][j]=A[n*(n+1)/2+n-1+(3*n-(i+j)-2)*(i+j-n-1)/2+n-j]

测试程序如下:
#include<stdio.h>
int main() {
int i,j;
int b[20][20];
int n=11;
for (i=0;i<n;i++)
for (j=0;j<n;j++) {
if (i+j<n) {
if ((i+j)%2) {
b[i][j]=1+(i+j+2)*(i+j-1)/2+i+1;
}else {
b[i][j]=(i+j+1)*(i+j)/2+j+1;
}
}else {
if (n%2) {
if ((i+j-n+1)%2) {
b[i][j]=n*(n+1)/2+(3*n-(i+j)-1)*(i+j-n)/2+n-j;
}else {
b[i][j]=n*(n+1)/2+n-1+(3*n-(i+j)-2)*(i+j-n-1)/2+n-i;
}
}else {
if ((i+j-n+1)%2) {
b[i][j]=n*(n+1)/2+(3*n-(i+j)-1)*(i+j-n)/2+n-i;
}else {
b[i][j]=n*(n+1)/2+n-1+(3*n-(i+j)-2)*(i+j-n-1)/2+n-j;
}
}
}
}
for (i=0;i<n;i++) {
for (j=0;j<n;j++) printf("%4d",b[i][j]);
printf("\n");
}
return 0;
}

33,008

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧