杜老师的幻方
题目背景
众所周知,dls精通玩转魔方!(等一下你说的这个和幻方有什么关系?)
但是作为D班小菜鸡的你虽然不会玩转魔方,但一定可以玩转幻方!
我们这样来定义幻方:
? 它是一个 \(n×n\) 的方阵 \(A\)
? 它的每一个元素都是正整数
? 它的每一行之和、每一列之和以及两条对角线之和均相等
(注意我们这个幻方没有要求数字范围,且也没有要求每个数只出现过一次)
现在dls扛着一个缺了一个数的幻方,你能把这个缺的数填出来吗?
输入格式
第一行,一个正整数 \(n\)。
接下来 \(n\) 行,每行 \(n\) 个非负整数 \(A_{i,j}\),代表幻方里的数,如果 \(A{i,j}=0\),则代表这个数是你要填的。
输出格式
你需要输出一个整数 \(x\),使得填入这个数后,方阵是幻方。
如果不存在满足要求的 \(x\),输出 \(?1\)。
如果有多解,须输出最小的解。
样例
input1
3
4 0 2
3 5 7
8 1 6
output1
9
input2
10
92 67 99 74 1 51 8 58 15 40
17 42 24 49 0 26 83 33 90 65
98 73 80 55 7 57 14 64 16 41
23 48 5 30 82 32 89 39 91 66
4 54 81 56 88 63 20 70 22 47
79 29 6 31 13 38 95 45 97 72
85 60 87 62 19 69 21 71 3 28
10 35 12 37 94 44 96 46 78 53
86 61 93 68 25 75 2 52 9 34
11 36 18 43 100 50 77 27 84 59
output2
76
数据范围
时间限制:1s
空间限制:256M
对于 60 的数据, \(n≤100\)。
对于 100 的数据, \(1≤n≤1000,0≤A_{i,j}≤10^9\)。
保证恰有一个 \(A_{i,j}=0\)。
找到那一个空着的数。
然后我们找一行或一列求一个和s,在把空着的数所在的那一行或一列其余数的和p,s减去p就是那个答案。
#include
const int N=1005;
int a[N][N],n,x,y;
long long s,t;
int main()
{
scanf("%d",&n);
if(n==1)
{
putchar('1');
return 0;
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
scanf("%d",&a[i][j]);
if(!a[i][j])
x=i,y=j;
}
}
for(int i=1;i<=n;i++)
s+=a[x+1][i],t+=a[x][i];
if(s