1. 程式人生 > >Board

Board

連結:https://www.nowcoder.com/acm/contest/206/B
來源:牛客網
題目描述
恬恬有一個nx n的陣列。她在用這個陣列玩遊戲:
開始時,陣列中每一個元素都是0。
恬恬會做某些操作。在一次操作中,她可以將某一行的所有元素同時加上一個值,也可以將某一列的所有元素同時加上一個值。
在幾次操作後,一個元素被隱藏了。你能幫助她回憶隱藏的數是幾嗎?
輸入描述:
第一行一個整數n(1≤ n≤ 1000)。
接下來n行每行n個整數表示陣列a。
第(i+1)行的第j個元素表示aij(aij=-1或0≤ aij ≤ 10000)。-1表示隱藏的元素。
輸出描述:
僅一個整數表示答案。
示例1
輸入
複製
3
1 2 1
0 -1 0
0 1 0
輸出
複製
1

有點坑這道題,一開始想了兩個思路都判了好多秒才錯,感覺差點什麼特例沒判,最後隊友終於找出,差點自閉
思路就是每一行每一列依次刪除每一行/列的最小值,隱藏數的那一行和列就不刪,刪到最後剩下就是隱藏數和所在的那一行和列,把行和列的數加起來就是隱藏數,然後坑點就是一開始直接加g[x][0] g[0][y] 沒有考慮到如果隱藏數就是在0這個位置呢,就錯了

程式碼:

#include <cstdio>
#include <algorithm>
using namespace std;
int n;
const int N=1005;
int g[N][N];
int hang[
N]; int lie[N]; int main(void){ scanf("%d",&n); int x,y; for(int i=0;i<n;i++){ int Min=0x3f3f3f3f; for(int j=0;j<n;j++){ scanf("%d",&g[i][j]); if(g[i][j]==-1){ x=i; y=j; continue; }
Min=min(Min,g[i][j]); } hang[i]=Min; } for(int i=0;i<n;i++){ bool flag=true; for(int j=0;j<n;j++){ if(g[i][j]==-1){ flag=false; break; } } if(flag){ for(int j=0;j<n;j++){ g[i][j]-=hang[i]; } } } for(int j=0;j<n;j++){ int Min=0x3f3f3f3f; for(int i=0;i<n;i++){ Min=min(Min,g[i][j]); } bool flag=true; for(int i=0;i<n;i++){ if(g[i][j]==-1){ flag=false; break; } } if(flag){ for(int i=0;i<n;i++){ g[i][j]-=Min; } } } // for(int i=0;i<n;i++){ // for(int j=0;j<n;j++){ // printf("%d ",g[i][j]); // } // printf("\n"); // } int fx=0; for(int j=0;j<n;j++){ if(g[x][j]!=-1){ fx=g[x][j]; break; } } int fy=0; for(int i=0;i<n;i++){ if(g[i][y]!=-1){ fy=g[i][y]; break; } } //printf("%d\n",g[x][0]+g[0][y]); printf("%d\n",fx+fy); return 0; }