题目地址: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 }