Board(思维)
思路:因为只有一个数不知道,设 ( x , y ) = r [ x ] + c [ y ] (x,y)=r[x]+c[y] (x,y)=r[x]+c[y]. r [ i ] r[i] r[i]表示对行加的数之和, c [ i ] c[i] c[i]表示对列加的数之和,要求 r [ x ] + c [ y ] r[x]+c[y] r[x]+c[y]我们可以间接用一个矩形求出来。
对任意 ( i , j ) , i ! = x , j ! = y (i,j),i!=x,j!=y (i,j),i!=x,j!=y
显然有 ( x , j ) , ( x , y ) , ( i , j ) , ( x , j ) (x,j),(x,y),(i,j),(x,j) (x,j),(x,y),(i,j),(x,j)组成一个矩形。
(
x
,
j
)
+
(
i
,
y
)
−
(
i
,
j
)
=
r
[
x
]
+
c
[
j
]
+
r
[
i
]
+
c
[
y
]
−
r
[
i
]
−
c
[
j
]
=
r
[
x
]
+
c
[
y
]
(x,j)+(i,y)-(i,j)=r[x]+c[j]+r[i]+c[y]-r[i]-c[j]=r[x]+c[y]
(x,j)+(i,y)−(i,j)=r[x]+c[j]+r[i]+c[y]−r[i]−c[j]=r[x]+c[y]
AC代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e3+5;
#define mst(a) memset(a,0,sizeof a)
int n,x,y,i,j,a[N][N];
int main(){
scanf("%d",&n);
for(i=1;i<=n;i++)
for(j=1;j<=n;j++){
scanf("%d",&a[i][j]);
if(a[i][j]==-1) x=i,y=j;
}
i=1,j=1;
if(i==x) i++;
if(j==y) j++;
printf("%d\n",a[i][y]+a[x][j]-a[i][j]);
return 0;
}