1160ヘビ行列(codevs)
2811 ワード
http://codevs.cn/problem/1160/
タイトルの説明
Description
小明は1つのデジタルゲームを游んで、n行のn列のデジタル行列(ここでnは100を超えない奇数)を取って、数字の补填方法は:行列の中心で1から反时计回りの方向で迂回して、1周ごとに拡大して、n行のn列が数字を満たすまで、このn行のn列の正方形行列とその対角線の数字の和を出力してください.
説明の入力
Input Description
n(すなわちn行n列)
出力の説明
Output Description
n+1行,n行からなる行列,最後の行対角線数の和
サンプル入力
Sample Input
3
サンプル出力
Sample Output
5 4 36 1 27 8 925
ゆっくり列挙すればいいです.
タイトルの説明
Description
小明は1つのデジタルゲームを游んで、n行のn列のデジタル行列(ここでnは100を超えない奇数)を取って、数字の补填方法は:行列の中心で1から反时计回りの方向で迂回して、1周ごとに拡大して、n行のn列が数字を満たすまで、このn行のn列の正方形行列とその対角線の数字の和を出力してください.
説明の入力
Input Description
n(すなわちn行n列)
出力の説明
Output Description
n+1行,n行からなる行列,最後の行対角線数の和
サンプル入力
Sample Input
3
サンプル出力
Sample Output
5 4 36 1 27 8 925
#include<cstdio>
#include<iostream>
using namespace std;
int ans[102][102];
int main()
{
int n,x,y,sum=0;
cin>>n;
x=y=(n+1)/2;
ans[x][y]=1;
for (int i=2;i<=n;i++)
{
int a,b;
if (i%2==0) b=y+1;
else b=y-1;
ans[x][b]=ans[x][y]+1;
y=b;
for (int j=1;j<i;j++)
{
if (i%2==0)
a=x-j;
else a=x+j;
ans[a][y]=ans[x][y]+j;
}
x=a;
for (int j=1;j<i;j++)
{
if (i%2==0)
b=y-j;
else b=y+j;
ans[x][b]=ans[x][y]+j;
}
y=b;
}
for (int i=1;i<=n;i++)
{
for (int j=1;j<=n;j++)
cout<<ans[i][j]<<' ';
cout<<endl;
}
for (int i=1;i<=n;i++)
sum+=(ans[i][i]+ans[i][n+1-i]);
sum-=1;
cout<<sum;
return 0;
}
ゆっくり列挙すればいいです.