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;
}

 

posted @ 2015-11-22 13:41  xing-xing  阅读(145)  评论(0)    收藏  举报