问题描述:在矩阵中心从1开始以逆时针方向绕行,逐圈扩大,直到n行n列填满数字
并输出矩阵对角线数字之和。
输入样例:
3
输出样例:
5 4 3
6 1 2
7 8 9
25
解题思路:
定义四个方向,比如我们用k来代替方向,k为0的时候右移,k为1的时候上移,k为2的时候左移,k为3的时候下移。
循环的次数为N*N-1次(起始位置我们定义好了)
#include<iostream>
#include<iomanip>
using namespace std;
int main()
{
int i,j,k;
int t=1,t1=1,t2=1,t3=1;//定义拐点
int k=0,n;//k为0的时候右移,k为1的时候上移,k为2的时候左移,k为3的时候下移。
int a[10][10];
printf("请输入矩阵的阶乘:");
cin>>n;
i=n/2;//
j=(n-1)/2;//求解起始位置的值
a[i][j]=1;//给起始位置赋初值
while(x<n*n-1)
{
if(k==0)//右移
{
a[i][j+1]=a[i][j]+1;
j++;
if((j==n-1)/2+t)//此处t的用意是用来判断蛇头从由右移到上移的拐点的访问次数,
{ //这个次数与起始的坐标之和用来作为判断条件(下同)
t++;
k=1;
}
else
{
k=0;
}
}
else if(k==1)//上移
{
a[i-1][j]=a[i][j]+1;
i--;
if(i==n/2-t1)
{
t1++;
k=2;
}
else
{
k=1;
}
}
else if(k==2)//左移
{
a[i][j-1]=a[i][j]+1;
j--;
if(j==(n-1)/2-t2)
{
t2++;
k=3;
}
else
{
k=2;
}
}
else//下移
{
a[i+1][j]=a[i][j]+1;
i++;
if(i==n/2+t3)
{
t3++;
k=0;
}
else
k=3;
}
x++;
}
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
cout<<setw(3)<<left<a[i][j];
cout<<endl;
}
}//如遇到更加好用的方法会陆续更新,并会将一类题型放在一起