zoukankan      html  css  js  c++  java
  • hihocoder 第五十二周 高斯消元·二【高斯消元解异或方程 难点【模板】】

    题目地址:http://hihocoder.com/contest/hiho57/problem/1

    输入

    第1..5行:1个长度为6的字符串,表示该行的格子状态,1表示该格子是亮着的,0表示该格子是暗的。

    保证一定存在解,且一定存在暗着的格子。

    输出

    需要按下的格子数量k,表示按下这k个位置后就可以将整个游戏板所有的格子都点亮。

    接下来k行,每行一个坐标(x,y),表示需要按下格子(x,y)。x坐标较小的先输出,若x相同,则先输出y坐标较小的。

    样例输入
    001111
    011111
    111111
    111110 
    111100
    样例输出
    2
    1 1
    5 6
    分析:这个是一道高斯消元解异或方程的问题,样例输入要当成字符串读入。我用的模板算法是将所有的1翻成0.
    所以在做这道题目时,我读入样例输入矩阵时,将0替换成1存储,将1替换成0存储。
    代码:
     1 #include <stdio.h>
     2 #include <string.h>
     3 #include <stdlib.h>
     4 #include <ctype.h>
     5 #include <math.h>
     6 #include <cmath>
     7 #include <iostream>
     8 #include <string>
     9 #include <queue>
    10 #include <stack>
    11 #include <vector>
    12 #include <algorithm>
    13 #define N 100000+100
    14 
    15 using namespace std;
    16 
    17 int a[35][35]; //0 1矩阵
    18 int x[35];
    19 
    20 void gauss()
    21 {
    22     int i, j, k;
    23     for(k=0; k<30; k++)//表示列
    24     {
    25         i=k;
    26         for(i; i<30; i++)
    27             if(a[i][k]!=0 )//当前位置不等于0
    28                 break;
    29         for(j=0; j<=30; j++)
    30             swap(a[k][j], a[i][j] );
    31         for(i=0; i<30; i++){
    32             if(k!=i && a[i][k] ){
    33                 for(j=0; j<=30; j++)
    34                     a[i][j]=a[k][j]^a[i][j];
    35             }
    36         }
    37     }
    38     for(i=0; i<30; i++)
    39         x[i]=a[i][30];
    40 }
    41 
    42 
    43 int main()
    44 {
    45     int i, j, k;
    46     memset(a, 0, sizeof(a));
    47     memset(x, 0, sizeof(x));
    48     char s[10];
    49     int e=0;
    50     for(i=0; i<5; i++){
    51         scanf("%s", s);
    52         for(j=0; j<6; j++)
    53             if(s[j]=='1') a[e++][30]=0;
    54             else a[e++][30]=1;
    55     }
    56 
    57     /* 这是按照数字读入的方式
    58     for(i=0; i<30; i++){
    59         scanf("%d", &a[i][30]);
    60         x[i]=0;   //为什么放在30的位置上
    61     } */
    62 
    63     for(i=0; i<30; i++){
    64         a[i][i]=1; //
    65         if( i%6!=0 ) //判断是不是矩阵的最左边
    66             a[i-1][i]=1;//左标记
    67         if( i%6!=5 ) //判断是不是矩阵的最右边
    68             a[i+1][i]=1;//右标记
    69         if(i>5) //判断是不是第一行
    70             a[i-6][i]=1;//上标记
    71         if(i<24) //判断是不是最后一行
    72             a[i+6][i]=1;//下标记
    73     }//影响矩阵生成完毕
    74 
    75     gauss();
    76     int cnt=0;
    77     for(i=0; i<30; i++)
    78         if(x[i]==1) cnt++;
    79     printf("%d
    ",cnt );
    80     for (i=0; i<30; i++)
    81         if(x[i]==1 ){
    82             printf("%d %d
    ", (i/6)+1, (i%6)+1 );
    83         }
    84 
    85     return 0;
    86 }
    View Code
    
    
  • 相关阅读:
    并不对劲的loj3124:uoj477:p5405:[CTS2019]氪金手游
    并不对劲的loj6498. 「雅礼集训 2018 Day2」农民
    并不对劲的loj2251:p3688[ZJOI2017]树状数组
    并不对劲的loj2050:p3248:[HNOI2016]树
    并不对劲的BJOI2020
    并不对劲的loj3110:p5358:[SDOI2019]快速查询
    并不对劲的loj3111:p5359:[SDOI2019]染色
    (困难) CF 484E Sign on Fence,整体二分+线段树
    算法录 之 拓扑排序和欧拉路径。
    数据结构录 之 BST的高级应用。
  • 原文地址:https://www.cnblogs.com/yspworld/p/4698756.html
Copyright © 2011-2022 走看看