一天一道算法题,今天完成任务,智商不够,做的好辛苦…………
问题:
题目描述
yyf玩一个数字游戏,取个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>
#include <string>
#include <iostream>
using namespace std;
enum en {L,U,R,D};
int main()
{
int k;
// printf("请输入一个奇数:");
scanf("%d",&k);
int n=k*k;
int i=k-1;
int j=k-1;
int f[k][k] ;
int s = n;
for(int m=0;m<k;++m)
{
for(int t=0;t<k;++t)
f[m][t] = 0;
}
int Flag = L;
while(1)
{
f[i][j] =n--;
if(n<1)
break;
switch(Flag)
{
case L:
{
if(j-1>=0 && !f[i][j-1])
{
--j;
// f[i][j] =n--;
break;
}
s +=f[i][j];
Flag = U;
}
case U:
{
if(i-1>=0 && !f[i-1][j])
{
--i;
// f[i][j] =n--;
break;
}
s +=f[i][j];
Flag = R;
}
case R:
{
if(j+1<k && !f[i][j+1])
{
++j;
// f[i][j] =n--;
break;
}
s +=f[i][j];
Flag = D;
}
case D:
{
if( i+1<k && !f[i+1][j])
{
++i;
// f[i][j] =n--;
break;
}
s +=f[i][j];
Flag = L;
}
default: //这里必须有这个,不能用 break;
{
if(j-1>=0 && !f[i][j-1])
{
--j;
break;
}
}
}
}
for(i=0;i<k;++i)
{
for(j=0;j<k;++j)
{
cout<<f[i][j]<<' ';
}
cout<<endl;
}
cout<<s-1;
return 0;
}