POJ_1222
第一次接触高斯消元的题目,基本算是仿写出来的。由于题目没有说无解,也没有用special judge,所以应该按有唯一解的情况去做就可以了。
当然这个题目也可以用枚举第一行的操作+搜索的办法去解,一些思路可以参考我的POJ_1753的解题报告:http://www.cnblogs.com/staginner/archive/2011/10/29/2228784.html。
#include<stdio.h> #include<string.h> #include<iostream> #define MAXD 35 using namespace std; int dx[] = {0, -1, 1, 0, 0}, dy[] = {0, 0, 0, -1, 1}; int mat[MAXD][MAXD], ans[MAXD]; void init() { int i, j, k, x, y; memset(mat, 0, sizeof(mat)); for(i = 0; i < 30; i ++) scanf("%d", &mat[i][30]); for(i = 0; i < 5; i ++) for(j = 0; j < 6; j ++) for(k = 0; k < 5; k ++) { x = i + dx[k], y = j + dy[k]; if(x >= 0 && x < 5 && y >= 0 && y < 6) mat[i * 6 + j][x * 6 + y] = 1; } } void gauss() { int i, j, k; for(i = 0; i < 30; i ++) { if(mat[i][i] == 0) { for(j = i + 1; j < 30; j ++) if(mat[j][i]) { for(k = i; k <= 30; k ++) swap(mat[i][k], mat[j][k]); } } for(j = i + 1; j < 30; j ++) if(mat[j][i]) { for(k = i; k <= 30; k ++) mat[j][k] ^= mat[i][k]; } } } void solve() { int i, j; gauss(); for(i = 29; i >= 0; i --) { ans[i] = mat[i][30]; for(j = i + 1; j < 30; j ++) ans[i] ^= mat[i][j] * ans[j]; } for(i = 0; i < 5; i ++) { printf("%d", ans[i * 6]); for(j = 1; j < 6; j ++) printf(" %d", ans[i * 6 + j]); printf("\n"); } } int main() { int t, tt; scanf("%d", &t); for(tt = 0; tt < t; tt ++) { init(); printf("PUZZLE #%d\n", tt + 1); solve(); } return 0; }