POJ1166 高斯消元法 xingxing在努力
这道题类似于开关问题, 不过不同的是这道题的状态有4个, 因此在高斯消元的部分也有一些改动, 另外需要注意的是这道题的开始状态已近给出,末状态全部为0, 因此在构造增广矩阵的时候也应该注意。感谢winddreams, http://blog.csdn.net/winddreams/article/details/47261653, 参考了他的高斯消元部分, 自我感觉写的相当好。。这里附上代码:
#include <cstdio> #include <cstring> #include <algorithm> using namespace std; int a[15][15]; int ans[15]; int equ, var; char s[9][10] = {"ABDE", "ABC", "BCEF", "ADG", "BDEFH", "CFI", "DEGH", "GHI", "EFHI"}; void debug() { printf("debug-------------\n"); for(int i=0; i<equ; i++) { for(int j=0; j<=var; j++) printf("%d ", a[i][j]); printf("\n"); } } void init() //构造增广矩阵 { memset(a, 0, sizeof(a)); for(int i=0; i<9; i++) { for(int j=0; j<strlen(s[i]); j++) a[s[i][j]-'A'][i] = 1; } } void gauss() { int i, j, k, l, temp, sum; for(i=0,k=0; i<9&&k<9; i++,k++) { //处理第i个方程的第k个变量 for(j=i; j<9; j++) if(a[j][k]) break; if(j >= 9) { i--; continue; } if(i != j) //交换第i行和第j行 { for(l=k; l<=9; l++) swap(a[i][l], a[j][l]); } for(j=i+1; j<9; j++) //利用第i行消去第i行后面的行 { if(!a[j][k]) continue; temp = a[j][k]; for(l=k; l<=9; l++) { a[j][l] = a[i][l]*temp - a[j][l]*a[i][k]; a[j][l] = (a[j][l]%4 + 4)%4; } } } //debug(); sum = 0; for(i=8; i>=0; i--) { for(j=i+1; j<9; j++) //减去已经求解出来的未知数 { a[i][9] -= ans[j]*a[i][j]; a[i][9] = (a[i][9]%4+4)%4; } for(int j=0; j<4; j++) //求解当前的未知数的解 if(a[i][i]*j%4 == a[i][9]) ans[i] = j, sum+=j; } for(int i=0; i<9; i++) //输出答案 { while(ans[i]--) { sum--; if(sum) printf("%d ", i+1); else printf("%d\n", i+1); } } } int main() { equ = 9; var = 9; bool flog = true; //debug(); while(1) { init(); for(int i=0; i<9; i++) if(scanf("%d", &a[i][9])==EOF) { flog = false; break; } for(int i=0; i<9; i++) { a[i][9] = ((4-a[i][9])%4+4)%4; } if(flog == false) break; //debug(); gauss(); } return 0; }

浙公网安备 33010602011771号