//题目:输入n 求一个n*n的矩阵,规定矩阵沿45度角线递增,
//1.递增的方向只有2个:左下,右上。 如果之前是按左下递增,那么之后是按右上递增,再按左下方递增
//2.同一个斜线上数据的规律是:下标(i+j)的和都一样。
#include <iostream>
#include <iomanip>
using namespace std;
int main()
{
int N;
int s,i,j;
cout<<"Please Input The Number!"<<endl;
cin>>N;
int** Arr=new int*[N];//int** Arr=(int **)malloc(N*sizeof(int));
for(i=0;i<N;i++)
Arr[i]=new int[N];//Arr[i]=(int*)malloc(N*sizeof(int));严格来讲这里应该加强防错处理。
for(i=0;i<N;i++)
for(j=0;j<N-i;j++)
{
s=i+j;
if(s<N)
{
Arr[i][j]=s*(s+1)/2+((s%2==0)? j:i);
}
}
for(i=N-1;i>0;i--)
for(j=N-i;j<N;j++)
{
Arr[i][j]=N*N-1-Arr[N-1-i][N-1-j];
}
for(i=0;i<N;i++)
{
for(j=0;j<N;j++)
cout<<setw(6)<<Arr[i][j];
cout<<endl;
}
return 0;
}
另外一种实现:
int **printnxn(int **pSpace, int N)
{
int s, i, j;
int squa;
pSpace = (int **)malloc(N*sizeof(int *));
if (pSpace == NULL)
return 0;
for (i = 0; i<N; i++)
{
if ((pSpace[i] = (int *)malloc(N*sizeof(int))) == NULL)
{
while (--i>0)
{
free(pSpace[i]);
}
free(pSpace);
return 0;
}
}
squa = N*N;
for (i = 0; i<N; i++)
{
for (j = 0; j<N; j++)
{
s = i + j;
if (s<N)//三角形,求面积,加上偏移
{
pSpace[i][j] = s*(s + 1) / 2 + (((i + j) % 2 == 1) ? i : j);
}
else//转换成上面的方式
{
s = (N - 1 - i) + (N - 1 - j);
pSpace[i][j] = squa - s*(s + 1) / 2 - (N - (((i + j) % 2 == 1) ? i : j));
}
}
}
for (i = 0; i<N; i++)
{
for (j = 0; j<N; j++)
{
printf("%6d", pSpace[i][j]);
}
printf("\n");
}
return pSpace;
}
int _tmain(int argc, _TCHAR* argv[])
{
int N;
scanf_s("%d", &N);
int **p = NULL;
printnxn(p, N);
system("pause");
return 0;
}