POJ_1222_高斯消元
题目描述:
每组数据给出一个5*6的0 1矩阵,每次操作可以把某个位置及其四周的位置0 1置换,要求输出操作位置的矩阵。
思路:
每个位置操作2次则等于没有操作,所以每个位置有操作和不操作两种选择,爆搜应该会超时。
在网上看到了高斯消元的做法,按照每个操作位置影响的位置构造系数矩阵,然后读入题目的数据构成增广矩阵。
接下来的做法便和高斯消元一样,只是把原来的-变成了^。
30条方程,30个未知量,所以最终的解也是唯一。
#include<cstdio> #include<iostream> using namespace std; int a[31][31] = {0}; int main() { int n; cin >> n; for(int x = 1;x <= n;x++) { for(int i = 0;i < 30;i++) { a[i][i] = 1; if(i > 5) a[i][i-6] = 1; if(i < 24) a[i][i+6] = 1; if(i%6) a[i][i-1] = 1; if((i+1)%6) a[i][i+1] = 1; } for(int i = 0;i < 30;i++) cin >> a[i][30]; for(int i = 0;i < 30;i++) { int temp = i; for(;temp < 30;temp++) { if(a[temp][i]) { for(int j = 0;j <= 30;j++) swap(a[temp][j],a[i][j]); break; } } for(int j = 0;j < 30;j++) { if(j != i && a[j][i]) { for(int k = i;k <= 30;k++) { a[j][k] ^= a[i][k]; } } } } cout << "PUZZLE #" << x << endl; for(int i = 0;i < 30;i++) { if((i+1)%6) cout << a[i][30] << " "; else cout << a[i][30] << endl; } } return 0; }