zoukankan      html  css  js  c++  java
  • codeforces 711B

    题目链接: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
    ");
    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
    ",na[x][y]<1?-1:na[x][y]);
    77         else printf("-1
    ");
    78     }
    79     return 0;
    80 }
  • 相关阅读:
    小猫爬山
    方格取数
    Bash 脚本编程
    树链剖分学习笔记
    输入输出优化
    没有上司的舞会
    线性dp 之 麻烦的聚餐
    飞翔
    挖地雷
    The Prices
  • 原文地址:https://www.cnblogs.com/A--Q/p/5901984.html
Copyright © 2011-2022 走看看