codeforces 711B - Chris and Magic Square(矩阵0位置填数)

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

题目大意:

  输入 n ,输入 n*n 的矩阵,有一个占位 0 , 求得将 0 位置换成其他的整数 使得矩阵 行列斜 和全部相等。

代码状态:

 

一把辛酸泪

 2016.09.24 8:14 再次更新  DOWN 【昨天晚上的‘杯具’要谨记,做题要看懂题,看清题的要求再做,切记、切记、切记】

补解题思路:

1.

 1.1 先特殊判断 n 是否==1,如果等于 1 则直接输出 1 即可

 1.2 如果 n > 1 判断 0 的位置在哪个位置,找一个要填入到0位置的数。

    如果 0 在第一行,那么用第二行的和 减去 第一行的和,便是要填入的值.

    如果 0 在最后一行,那么用倒数第二行的和 减去 最后一行的和,便是要填入的值.

    其他的 则 0 在中间位置 ,那么可以用 前一行或者后一行的和 减去 0 所在的和,便是要填入的值.

    (用列减也可以)

    【看清题意,如果填入的值 <1 则输出 -1】

2. 

  将要填入的值填到 0 的位置 进行全部的扫描判断即可。全盘的扫描不在解释。

AC Code:

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 const int N=500+5;
 4 typedef  long long ll;
 5 ll na[N][N];
 6 int check(int n)
 7 {
 8     ll ans=0,ans1=0;
 9     int i,j;
10     for(i=1; i<=n; i++)
11         ans+=na[1][i],ans1+=na[i][1];
12     if(ans!=ans1)
13         return 0;
14     ans1=0;
15     ll ans2=0;
16     for(i=1; i<=n; i++)
17     {
18         for(j=1; j<=n; j++)
19             ans1+=na[i][j], ans2+=na[j][i];
20         if(ans!=ans2||ans1!=ans2||ans!=ans1)
21             return 0;
22         ans1=ans2=0;
23 
24     }
25     ans1=ans2=0;
26     for(i=1; i<=n; i++)
27     {
28         for(j=1; j<=n; j++)
29             if(i==j)
30                 ans1+=na[i][j],ans2+=na[i][n-i+1];
31     }
32     if(ans!=ans2||ans1!=ans2||ans!=ans1)
33         return 0;
34     return 1;
35 }
36 int main()
37 {
38     int n;
39     while(~scanf("%d",&n))
40     {
41         int i,j;
42         if(n==1)
43         {
44             scanf("%d",&n);
45             printf("1\n");
46             continue;
47         }
48         int x,y;
49         for(i=1; i<=n; i++)
50             for(j=1; j<=n; j++)
51             {
52                 scanf("%d",&na[i][j]);
53                 if(na[i][j]==0)x=i,y=j;
54             }
55         ll ans=0,ans1=0;
56         if(x==1)
57         {
58             for(i=1; i<=n; i++)
59                 ans+=na[1][i],ans1+=na[2][i];
60             na[x][y]=ans1-ans;
61         }
62         else if(x==n)
63         {
64             for(i=1; i<=n; i++)
65                 ans+=na[n][i],ans1+=na[n-1][i];
66             na[x][y]=ans1-ans;
67         }
68         else
69         {
70             for(i=1; i<=n; i++)
71                 ans+=na[x][i],ans1+=na[x-1][i];
72             na[x][y]=abs(ans1-ans);
73         }
74 
75         if(check(n))
76             printf("%I64d\n",na[x][y]<1?-1:na[x][y]);
77         else printf("-1\n");
78     }
79     return 0;
80 }

 

posted @ 2016-09-23 22:48  马丁黄瓜啊  阅读(288)  评论(0编辑  收藏  举报