矩阵问题,请帮忙!!!

three1103 2002-11-27 08:11:26
在一个N×N的方阵中,填入1,2,……N×N个数,并要求构成如下的格式:
例:
N=5
13 14 15 16 1
12 23 24 17 2
11 22 25 18 3
10 21 20 19 4
9 8 7 6 5
N=6
16 17 18 19 20 1
15 30 31 32 21 2
14 29 36 33 22 3
13 28 35 34 23 4
12 27 26 25 24 5
11 10 9 8 7 6
该怎么做呀??
...全文
60 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
three1103 2003-01-24
  • 打赏
  • 举报
回复
各位高手兄弟,十分感谢!!!
WaterWalker 2002-11-28
  • 打赏
  • 举报
回复
#include<stdio.h>
#define N 5
int a[N][N];
main()
{
int i,j,t,index=1;
t=N;
i=-1;j=N;
for(;t>0;t--)
{
for(i++,j--;i<t;i++) a[i][j]=index++;
for(i--,j--;j>=N-t;j--) a[i][j]=index++;
for(i--,j++;i>=N-t;i--) a[i][j]=index++;
for(i++,j++;j<t-1;j++) a[i][j]=index++;
}
for(i=0;i<N;i++)
{
for(j=0;j<N;j++)
printf("%d\t",a[i][j]);
putchar('\n');
}
}
eion 2002-11-28
  • 打赏
  • 举报
回复
佩服
WaterWalker(水上飘,沉浮不由我)
的算法,简捷!
eion 2002-11-28
  • 打赏
  • 举报
回复
void cir()
{
const int N = 10;
int arr[N][N];

// 四个方向,分别表示下 左 上 右
int dir[4][2] = { {+1, 0}, {0, -1}, {-1, 0}, {0, +1}};
int dir_now = 0; // 当前的方向
int len = N; // 每个方向要写的数值
bool lensub = true; // 表示变更方向时是否要减小len的值

int x = -1, y = N-1; // 开始位置
int num = 0; // 不说了
while (len)
{
for ( int i=0; i<len; i++) // 每一轮有 len 个数被赋值
{
x += dir[dir_now][0]; // 在 x 方向上的偏移
y += dir[dir_now][1]; // 在 y 方向上的偏移
arr[x][y] = ++num; // 确定位置并赋值
//printf(" [%2d, %2d] ", x, y);
}
if (lensub) len --; // 确定是否要将len的值减小
lensub = !lensub; // 反转状态,表示每两次减小一次len值

//printf("\n");
dir_now = ++dir_now%4; // 改变方向
}

// 打印结果
for (int i=0; i<N; i++)
{
for (int j=0; j<N; j++) printf(" %3d", arr[i][j]);
printf("\n");
}
}

结果
28 29 30 31 32 33 34 35 36 1
27 58 59 60 61 62 63 64 37 2
26 57 80 81 82 83 84 65 38 3
25 56 79 94 95 96 85 66 39 4
24 55 78 93 100 97 86 67 40 5
23 54 77 92 99 98 87 68 41 6
22 53 76 91 90 89 88 69 42 7
21 52 75 74 73 72 71 70 43 8
20 51 50 49 48 47 46 45 44 9
19 18 17 16 15 14 13 12 11 10
sdx_none 2002-11-28
  • 打赏
  • 举报
回复
#include "iostream"
using namespace std;
const N=5;
int i_loop=N/2+N%2;
int arra[N][N];
int i,j,k,l;
k=1;
for(l=0;l<i_loop;l++)
{
for(i=l,j=l;j<N-l;j++,k++)
arra[i][j]=k;
j--;
i++;
for(;i<N-l;i++,k++)
arra[i][j]=k;
j--;
i--;
for(;j>=l;j--,k++)
arra[i][j]=k;
j++;
i--;
for(;i>l;i--,k++)
arra[i][j]=k;
}
for(i=0;i<N;i++)
{
for(j=0;j<N;j++)
cout<<arra[i][j]<<'\t';
cout<<endl;
}
EpopeeLei 2002-11-27
  • 打赏
  • 举报
回复
楼上的,太复杂了吧!
#include <iostream.h>
#include <iomanip.h>
#define Max 10

int main(int argc, char* argv[])
{
int i,j,x1,x2,c=1,a[Max][Max],n;
cout<<"Please input a integer:";
cin>>n;
x1=1;
x2=0;
for(i=0;i<n;i++)
for(j=0;j<n;j++)
a[i][j]=0;
i=0;
j=n-1;
while(c<=n*n)
{
a[i][j]=c;
c++;
if(x2==1)
if(j>=n-1||a[i][j+1]!=0)
{
x1=1;
x2=0;
}
if(x1==1)
if(i>=n-1||a[i+1][j]!=0)
{
x1=0;
x2=-1;
}
if(x2==-1)
if(j<=0||a[i][j-1]!=0)
{
x1=-1;
x2=0;
}
if(x1==-1)
if(i<=0||a[i-1][j]!=0)
{
x1=0;
x2=1;
}
i+=x1;
j+=x2;
}
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
cout<<setw(4)<<a[i][j];
}
cout<<endl;
}
return 0;
}
xunknown 2002-11-27
  • 打赏
  • 举报
回复
////HelixArray
#include <iostream.h>
////
class CHelixArray
{
unsigned int m_nRank;
int m_nFirstValue,m_nLastValue;
int m_nStep;
int m_nClockwise;
int *m_pArray;
public:

CHelixArray(unsigned int nRank,int nFirstValue=1,int nStep=1,int nClockwise=1);
CHelixArray(CHelixArray& aHelixArray);
CHelixArray();
virtual ~CHelixArray();
////
public:
unsigned int SetRank(unsigned int nRank);
unsigned int GetRank();
int RankChanged();
int IsValid();
int SetFirstValue(int nFirstValue);
int GetFirstValue();
int GetLastValue();
int SetStep(int nStep);
int GetStep();
int SetClockwise(int nClockwise=1);
int IsClockwise();

virtual int Initialize();
int Display();
private:
int InitialClockwise();
int InitialAnticlockwise();
};
CHelixArray::CHelixArray(unsigned int nRank,int nFirstValue,int nStep,int nClockwise)
{
m_nRank=nRank;
m_nFirstValue=m_nLastValue=nFirstValue;
m_nStep=nStep;
m_nClockwise=nClockwise;
m_pArray=NULL;
}
CHelixArray::CHelixArray(CHelixArray& aHelixArray)
{
}
CHelixArray::CHelixArray()
{
m_nRank=0;
m_nFirstValue=m_nLastValue=0;
m_nStep=1;
m_nClockwise=1;
m_pArray=NULL;
}
CHelixArray::~CHelixArray()
{
if(m_pArray)
{
delete[] m_pArray;
m_pArray=NULL;
}
}
int CHelixArray::Initialize()
{
if(!IsValid())return 0;

if(m_pArray && RankChanged())
{
delete[] m_pArray;
m_pArray=new int[m_nRank*m_nRank];
}
else if(!m_pArray)
{
m_pArray=new int[m_nRank*m_nRank];
}

if(!m_pArray)return 0;

if(IsClockwise())
{
return InitialClockwise();
}
else
{
return InitialAnticlockwise();
}
}
int CHelixArray::RankChanged()
{
return 1;
}
int CHelixArray::SetClockwise(int nClockwise)
{
int i=m_nClockwise;
m_nClockwise=nClockwise;
return i;
}
int CHelixArray::IsClockwise()
{
return m_nClockwise;
}
int CHelixArray::IsValid()
{
if(m_nRank>0)return m_nRank;
return 0;
}
unsigned int CHelixArray::SetRank(unsigned int nRank)
{
unsigned int r=m_nRank;
m_nRank=nRank;
return r;
}
int CHelixArray::InitialClockwise()
{
////顺时针方向初始化
if(!m_pArray)return 0;

int l=0,r=m_nRank-1,t=0,b=m_nRank-1;
int k=0;
int lr=1,tb=0,rl=0,bt=0;
unsigned int n=0;
for(int v=m_nFirstValue;n<m_nRank*m_nRank;n++,v+=m_nStep)
{
////顶上:从左往右赋值
if(lr)
{
m_pArray[t*m_nRank+k]=v;
k++;
if(k>r)
{
t++;
tb=1;
lr=0;
k=t;
}

}
////右边:从上往下赋值
else if(tb)
{
m_pArray[k*m_nRank+r]=v;
k++;
if(k>b)
{
r--;
rl=1;
tb=0;
k=r;
}

}
////下边:从右往左赋值
else if(rl)
{
m_pArray[b*m_nRank+k]=v;
k--;
if(k<l)
{
b--;
rl=0;
bt=1;
k=b;
}
}
////左边:从下往上赋值
else if(bt)
{
m_pArray[k*m_nRank+l]=v;
k--;
if(k<t)
{
l++;
lr=1;
tb=0;
k=l;
}
}
}
m_nLastValue=v-m_nStep;
return m_nLastValue;
}
int CHelixArray::InitialAnticlockwise()
{
////逆时针方向初始化
if(!m_pArray)return 0;

int l=0,r=m_nRank-1,t=0,b=m_nRank-1;
int k=0;
int lr=0,tb=1,rl=0,bt=0;
unsigned int n=0;
for(int v=m_nFirstValue;n<m_nRank*m_nRank;n++,v+=m_nStep)
{
////左边:从上往下赋值
if(tb)
{
m_pArray[k*m_nRank+l]=v;
k++;
if(k>b)
{
l++;
lr=1;
tb=0;
k=l;
}

}
////下边:从左往右赋值
else if(lr)
{
m_pArray[b*m_nRank+k]=v;
k++;
if(k>r)
{
b--;
lr=0;
bt=1;
k=b;
}

}
////右边:从下往上赋值
else if(bt)
{
m_pArray[k*m_nRank+r]=v;
k--;
if(k<t)
{
r--;
rl=1;
bt=0;
k=r;
}
}
////顶上:从右往左赋值
else if(rl)
{
m_pArray[t*m_nRank+k]=v;
k--;
if(k<l)
{
t++;
rl=0;
tb=1;
k=l;
}
}
}
m_nLastValue=v-m_nStep;
return m_nLastValue;
}
int CHelixArray::Display()
{
if(!m_pArray)return 0;
for(unsigned int i=0;i<m_nRank*m_nRank;i++)
{
if(!(i%m_nRank))cout<<"\n\n";
cout<<m_pArray[i]<<"\t";
}
cout<<"\n\n";
return i;
}

///////////////////////////////////
void main(void)
{
CHelixArray a(4);
a.Initialize();
a.Display();

a.SetRank(5);
a.SetClockwise(0);
a.Initialize();
a.Display();

//@**#---2002-11-11 14:57:31 (注释: X Vince 陈立福)---#**@
//1 2 3 4
//
//12 13 14 5
//
//11 16 15 6
//
//10 9 8 7

//@**#---2002-11-11 14:58:16 (注释: X Vince 陈立福)---#**@
//1 16 15 14 13
//
//2 17 24 23 12
//
//3 18 25 22 11
//
//4 19 20 21 10
//
//5 6 7 8 9
}
kxw 2002-11-27
  • 打赏
  • 举报
回复
用坐标来考虑,横坐标X开始得N,纵坐标为1,

纵坐标++,直到得N时,横坐标--,直到为1时

纵坐标--,。。。。。

以此类推
three1103 2002-11-27
  • 打赏
  • 举报
回复
分不够加的!!!

69,382

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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