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\n",cnt );
80     for (i=0; i<30; i++)
81         if(x[i]==1 ){
82             printf("%d %d\n", (i/6)+1, (i%6)+1 );
83         }
84 
85     return 0;
86 }
View Code

 

 
  

转载于:https://www.cnblogs.com/yspworld/p/4698756.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值