题目:在网格某一处填入一个正整数,使得网格每行,每列以及两条主对角线的和都相等
分析:题目不难,找到要填的那个数填进去,然后循环比较每行每列以及对角线的和是否相等,题目提交上去卡了几次要注意几点
注意:1.答案数据范围1<=x<=1e18,要用 long long
2.特殊情况,n==1时,由于一定有要填的数,所以一定有解
3.反正就是要注意看清楚题目和数据边界情况处理啦
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 using namespace std; 5 long long mp[505][505]; 6 long long row[505],col[505]; 7 int main() 8 { 9 int n; 10 scanf("%d",&n); 11 memset(row,0,sizeof(row)); 12 memset(col,0,sizeof(col)); 13 int x,y; 14 for(int i=0;i<n;i++) 15 { 16 for(int j=0;j<n;j++) 17 { 18 scanf("%d",&mp[i][j]); 19 if(mp[i][j]==0) 20 { 21 x=i;y=j; 22 } 23 row[i]+=mp[i][j]; 24 col[j]+=mp[i][j]; 25 } 26 } 27 bool is=1; 28 if(x==0) 29 { 30 mp[x][y]=row[1]-row[0]; 31 row[x]+=mp[x][y]; 32 col[y]+=mp[x][y]; 33 if(col[0]!=row[0]) 34 is=0; 35 else 36 { 37 for(int i=1;i<n;i++) 38 { 39 if(row[i]!=row[0]) 40 { 41 is=0;break; 42 } 43 if(col[i]!=col[0]) 44 { 45 is=0;break; 46 } 47 } 48 } 49 } 50 else 51 { 52 mp[x][y]=row[0]-row[x]; 53 row[x]+=mp[x][y]; 54 col[y]+=mp[x][y]; 55 if(col[0]!=row[0]) 56 is=0; 57 else 58 { 59 for(int i=1;i<n;i++) 60 { 61 if(row[i]!=row[0]) 62 { 63 is=0;break; 64 } 65 if(col[i]!=col[0]) 66 { 67 is=0;break; 68 } 69 } 70 } 71 } 72 long long dia1=0,dia2=0; 73 for(int i=0,j=n-1;(i<n&&j>=0);i++,j--) 74 { 75 dia1+=mp[i][i]; 76 dia2+=mp[i][j]; 77 } 78 if(dia1!=row[0]) 79 is=0; 80 else if(dia2!=dia1) 81 is=0; 82 if(n==1) //注意特判 83 cout<<"1"<<endl; 84 else if(is&&mp[x][y]>=1) //注意答案要>=1 85 cout<<mp[x][y]<<endl; 86 else 87 cout<<"-1"<<endl; 88 return 0; 89 }
时间: 2024-10-17 22:47:28