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)组成一个矩形。

Board(思维)_#define
( 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;
}