标签:
小明玩一个数字游戏,取个n行n列数字矩阵(其中n为不超过100的奇数),数字的填补方法为:在矩阵中心从1开始以逆时针方向绕行,逐圈扩大,直到n行n列填满数字,请输出该n行n列正方形矩阵以及其的对角线数字之和.
n(即n行n列)
n+1行,n行为组成的矩阵,最后一行为对角线数字之和
3
5 4 3
6 1 2
7 8 9
25
#include<stdio.h>
int main()
{
	int n,i,j,dir=1,s[100][100]={0},sum=0;//dir表示方向,有1,2,3,4四个值,分别表示右、上、左,下 
	scanf("%d",&n);
	//中间位置 
	i=n/2;
	j=i;
	s[i][j]=sum++; //sum 表示当前所要填写的数字,中间位置肯定为1 
	//因为螺旋方向是逆时针,即:右->上->左->下,循环。
	//需要注意的是:方向改变的条件是下一方向上的位置没有走过,那么怎么判断呢?
	//利用初始化为0,只要不为0说明走过了。 
	while(sum<=n*n)
	{
		switch(dir)
		{
			case 1://向右走 
				{
					s[i][j++]=sum++;
					if(s[i-1][j]==0)
					{
						dir=2;
					}
					break; 
				}
			case 2://向上走 
				{
					s[i--][j]=sum++;
					if(s[i][j-1]==0)
					{
						dir=3;
					}
					break; 
				}
			case 3://向左走 
				{
					s[i][j--]=sum++;
					if(s[i+1][j]==0)
					{
						dir=4;
					}
					break; 
				}
			default://向下走 
				{
					s[i++][j]=sum++;
					if(s[i][j+1]==0)
					{
						dir=1;
					}
					break; 
				}
		}
    } 
	sum=0;
	//左上角到右下角和 
	i=0;
	while(i<n)
	{
		sum+=s[i][i];
		i++;
	} 
	//左下角到右上角和 
	i=n-1;
	j=0;
	while(i>=0)
	{
		sum+=s[i][j];
		i--;
		j++;
	} 
	//去掉一次对角线中相交处即中心数字。 
	sum-=s[n/2][n/2];
	for(i=0;i<n;i++)
    {
    	for(j=0;j<n-1;j++)
    	{
    		printf("%d ",s[i][j]);
		}
		printf("%d\n",s[i][j]);
	}
	printf("%d\n",sum);
	return 0;
}
标签:
原文地址:http://www.cnblogs.com/xiangguoguo/p/5335222.html