1077: 摆方格
时间限制: 1 Sec 内存限制: 128 MB
提交: 18 解决: 12
[提交][状态][讨论版][命题人:uzzoj]
题目描述
给你一个n*n的方格,每个方格里的数必须连续摆放如
1 | 2 |
4 | 3 |
,下图为不连续的,请输出从左上角到右下角的对角线上的最大和
1 | 3 |
4 | 2 |
输入
输入包含多组测试数据。
每一行包括一个数据n,表示n*n的方格(保证所有数据在2^64范围内且n>0)
输出
每行输出占一行,输出最大的对角线之和。
样例输入
1
2
3
样例输出
1
6
19
#include <cstdio> //完美兼容了C的语法
#include <cstring> //字符串函数
#include <iostream> //流
using namespace std;
int main()
{
int n,x,y,z,sum1,sum2;
int T = 3;
while(T--)
{
cin >> n;
long a[100][100]= {0};
x = 0;
y = 0;
z = 1;
a[x][y]=1;
sum1 = 0;
sum2 = 0;
while (z<n*n)
{
//往右
while(y+1<n && !a[x][y+1])
{
a[x][++y]=++z;
}
//往下
while(x+1<n && !a[x+1][y])
{
a[++x][y]=++z;
}
//往左
while(y-1>=0 && !a[x][y-1])
{
a[x][--y]=++z;
}
//往上
while(x-1>=0 && !a[x-1][y])
{
a[--x][y]=++z;
}
}
//输出
for(x=0; x<n; x++)
{
for(y=0; y<n; y++)
{
if(x == y)
{
sum1 += a[x][y];
}
if(x+y == n-1)
{
sum2 += a[x][y];
}
}
}
if(sum1 < sum2)
{
sum1 = sum2;
}
cout << sum1<<endl;
}
return 0;
}