杜老师的幻方


题目背景
众所周知,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