codeforces #369div2 B. Chris and Magic Square

 

题目:在网格某一处填入一个正整数,使得网格每行,每列以及两条主对角线的和都相等

题目链接:http://codeforces.com/contest/711/problem/B

分析:题目不难,找到要填的那个数填进去,然后循环比较每行每列以及对角线的和是否相等,题目提交上去卡了几次要注意几点

注意:1.答案数据范围$1\leq x \leq 1e18$,要用 long long

        2.特殊情况,$n \equiv 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 }

 

posted @ 2016-08-31 14:28  萌新的学习之路  阅读(174)  评论(0编辑  收藏  举报