POJ1830開關問題——gauss消元
阿新 • • 發佈:2017-05-13
gauss 分析 .org cpp main gauss消元 ons == r+
題目鏈接
- 分析:
第一個高斯消元題目,操作是異或。奇偶能夠用0、1來表示,也就表示成bool類型的方程,操作是異或。和加法沒有差別
題目中有兩個未知量:每一個開關被按下的次數(0、1)、每一個開關的轉換次數。題目僅僅和操作次數的奇偶有關,所以用0、1表示之後,對於每一個開關的轉換次數就已經知道了。所以僅僅有一個未知量。能夠線性表示。練習使用模板
const int maxn = 40; int a[maxn][maxn]; int gauss(int N, int M) { int r, c, pvt; bool flag; for (r = 0, c = 0; r < N && c < M; ++ r, ++ c) { flag = false; for (int i = r; i < N; ++ i) if (a[i][c]) { flag = a[pvt=i][c]; break; } if (!flag) { r--; continue; } if (pvt != r) for (int j = r; j <= M; ++j) swap(a[r][j], a[pvt][j]); for (int i = r+1; i < N; ++i) if(a[i][c]) { a[i][c] = false; for (int j = c+1; j <= M; ++j) { if(a[r][j]) a[i][j] = !a[i][j]; } } } for (int i = r; i < N; ++i) if (a[i][M]) return -1; if (r < M) return M-r; for (int i = M-1; i >= 0; --i) { for (int j = i+1; j < M; ++j) a[i][M] ^= a[j][M]*a[i][j]; a[i][M] &= a[i][i]; } return 0; } int main() { // freopen("in.txt", "r", stdin); int T, n, x, y; RI(T); FE(kase, 1, T) { RI(n); CLR(a, 0); REP(i, n) RI(a[i][n]); REP(i, n) { int t; RI(t); a[i][n] ^= t; a[i][i] = 1; } while (RII(x, y) && x) { a[y - 1][x - 1] = 1; } int ans = gauss(n, n); if (ans == -1) puts("Oh,it‘s impossible~!!"); else WI(1 << ans); } return 0; }
POJ1830開關問題——gauss消元