蛇型矩阵-二维数组

问题描述:在矩阵中心从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;
		}
}//如遇到更加好用的方法会陆续更新,并会将一类题型放在一起

猜你喜欢

转载自blog.csdn.net/weixin_43843978/article/details/88068620
今日推荐