加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

PKU POJ 1222 高斯消元

(2010-03-28 21:32:00)
标签:

杂谈

分类: 杂题

    和POJ1681题目代码基本一样,详细说明见 1681的解题报告

    http://jeogia.blog.sohu.com/147140043.html

    代码:

#include<iostream>
#include<cmath>
using namespace std;
#define N 30
#define M 30
typedef int zzy;
zzy fab(zzy x) {return (x > 0 ? x : -x);}
void swap(zzy &x, zzy &y) { zzy temp = x; x = y; y = temp;}
zzy A[N][M 1]; //N 行 M 1列:多出来的一列是答案b列,增广矩阵
int move[4][2] = {{0, 1}, {0, -1}, {1, 0}, {-1, 0}};
void gaos(int r, int c)// c 为系数矩阵实际的列数,不带最后一列的增广部分
{
    int i = 0, j = 0;
    while(i < r && j < c)
    {
        int id = i;
        for(int k = i 1; k < r; k )
            if (fab(A[k][j]) > fab(A[id][j]))
                id = k;
        zzy temp;
        if (A[id][j] != 0)
        {
            temp = A[id][j];
            for(int k = j; k < c 1; k )
                swap(A[id][k], A[i][k]);
            for(int k = i 1; k < r; k )
                if (A[k][j] != 0)
                    for(int l = j; l < c 1; l )
                        A[k][l] = A[k][l] ^ A[i][l];
            i ;
        }
        j ;
    }
    for(i = r - 2; i >= 0; i--)
        for(j = i 1; j < r; j )
            A[i][c] ^= (A[i][j] && A[j][c]);
}
int x[5][6];
int main()
{
    //freopen("aaa.txt", "w", stdout);
    int t, cnt = 1;
    scanf("%d", &t);
    while(t--)
    {
        memset(A, 0, sizeof(A));
        for(int i = 0; i < 5; i )
            for(int j = 0; j < 6; j )
            {
                scanf("%d", &x[i][j]);
                if (x[i][j] != 0)
                    A[i * 6 j][5 * 6] = 1;
                A[i * 6 j][i * 6 j] = 1;
                for(int k = 0; k < 4; k )
                {
                    int a = i move[k][0], b = j move[k][1];
                    if (a >= 0 && a < 5 && b >= 0 && b < 6)
                        A[i * 6 j][a * 6 b] = 1;
                }
            }
        gaos(30, 30);
        printf("PUZZLE #%d\n", cnt );
        for(int i = 0; i < 5; i )
        {
            printf("%d", A[i * 6][30]);
            for(int j = 1; j < 6; j )
                printf(" %d", A[i * 6 j][30]);
            putchar('\n');
        }
    }
    return 0;
}

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有