1. 程式人生 > >hihor學習日記:hiho一下 第五十七週(高斯消元)

hihor學習日記:hiho一下 第五十七週(高斯消元)

http://hihocoder.com/contest/hiho57/problem/1

高斯消元的變種,因為圖很小所以而且每一個小格子都得為1,那麼就把圖中對某個小格子有作用的點標記起來,而他們的共同作用次數為奇數的話,小格子的狀態變化,反之不變,
在這裡插入圖片描述
在這裡插入圖片描述
在這裡插入圖片描述
注意這裡在處理矩陣時,對於第i列的數字如果原本就為0的話,就不用處理,否則會錯誤

AC程式碼:

#include <bits/stdc++.h>

using namespace std;
#define LL long long
const int Mod = 1e9 + 7;
const int maxn = 1e5
+ 5; const double eps = 0.00000001; const int INF = 0x3f3f3f3f; struct Change{ int x, y; bool friend operator < (Change a, Change b){ if(a.x == b.x) return a.y < b.y; return a.x < b.x; } }ch[maxn]; int a[35][35]; int b[35], x[35]; bool manySolution = false, noSolution =
false; void Swap(int i, int j) { for (int k = 1; k <= 30; k ++) swap(a[i][k], a[j][k]); swap(b[i], b[j]); } bool Check(int i) { bool vis = false; for (int k = 1; k <= 30; k ++) { if(a[i][k]) vis = true; } if(!vis && b[i]) return false; return
true; } void GS() { for (int i = 1; i <= 30; i ++) { bool vis = false; for (int j = i; j <= 30; j ++) { if(a[i][j] != 0) { Swap(i, j); vis = true; break; } } if(!vis) { manySolution = true; continue; } for (int j = i + 1; j <= 30; j ++) { if(a[j][i]) {//如果原本就為0,就不處理 for (int k = i; k <= 30; k ++) a[j][k] = a[j][k] ^ a[i][k]; b[j] = b[j] ^ b[i]; } } } for (int i = 1; i <= 30; i ++) { if(!Check(i)) { noSolution = true; return ; } } for (int i = 30; i >= 1; i --) { for (int j = i + 1; j <= 30; j ++) { b[i] = b[i] ^ (a[i][j] * x[j]); a[i][j] = 0; } x[i] = b[i] / a[i][i]; } } int main() { char c[35][35]; for (int i = 1; i <= 5; i ++) scanf("%s", c[i]); for (int i = 1; i <= 5; i ++) for (int j = 1; j <= 6; j ++) { b[(i - 1) * 6 + j] = c[i][j - 1] - '0'; b[(i - 1) * 6 + j] ^= 1; } memset(a, 0, sizeof(a)); for (int i = 1; i <= 30; i ++) { a[i][i] = 1; if(i + 1 <= 30 && i + 1 >= 1 && i % 6 != 0) a[i][i + 1] = 1; if(i - 1 <= 30 && i - 1 >= 1 && i % 6 != 1) a[i][i - 1] = 1; if(i + 6 <= 30 && i + 6 >= 1) a[i][i + 6] = 1; if(i - 6 <= 30 && i - 6 >= 1) a[i][i - 6] = 1; } GS(); int cnt = 0; for (int i = 1; i <= 30; i ++) { if(x[i]) { if(i % 6) { ch[cnt ++] = Change{i/6 + 1, i % 6}; }else { ch[cnt ++] = Change{i/6, 6}; } } } sort(ch, ch +cnt); cout << cnt << endl; for (int i = 0; i < cnt; i ++) cout << ch[i].x << " " << ch[i].y << endl; return 0; }