Online JudgeProblem SetAuthorsOnline ContestsUser
Web Board
Home Page
F.A.Qs
Statistical Charts
Problems
Submit Problem
Online Status
Prob.ID:
Register
Update your info
Authors ranklist
Current Contest
Past Contests
Scheduled Contests
Award Contest
User ID:
Password:
  Register

贴了个模板,改了改,过了 附代码

Posted by weihaohaoren at 2012-06-05 00:08:34 on Problem 1222
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<string>
#include<cmath>
#include<queue>
using namespace std;
typedef long long LL;
const double pi=acos(-1.0);


 
int equ[30][31]; 
int ans[30]; 


 

 // 有equ个方程,var个变元。增广阵行数为equ, 分别为0到equ - 1,列数为var + 1,分别为0到var.


// 解集.x[maxn]; 

 // 判断是否是不确定的变元.



 


//------------------------------------
inline int gcd(int a, int b)
{
    int t;
    while (b != 0)
    {
        t = b;
        b = a % b;
        a = t;
    }
    return a;
}

inline int lcm(int a, int b)
{
    return a * b / gcd(a, b);
}
// 高斯消元法解方程组(Gauss-Jordan elimination).(-2表示有浮点数解,但无整数解,-1表示无解,0表示唯一解,大于0表示无穷解,并返回自由变元的个数)
void Gauss(int equ,int a[][31],int x[])
{
    int i, j, k;
    int var=equ;
    int max_r; // 当前这列绝对值最大的行.
         int col; // 当前处理的列.
    int ta, tb;
    int LCM;
    int temp;
    // 转换为阶梯阵.
    col = 0; // 当前处理的列.
    for (k = 0; k < equ && col < var; k++, col++)
    { // 枚举当前处理的行.
        // 找到该col列元素绝对值最大的那行与第k行交换.(为了在除法时减小误差)
        max_r = k;
        for (i = k + 1; i < equ; i++)
        {
            if (abs(a[i][col]) > abs(a[max_r][col])) max_r = i;
        }
        if (max_r != k)
        { // 与第k行交换.
            for (j = k; j < var + 1; j++) swap(a[k][j], a[max_r][j]);
        }
        if (a[k][col] == 0)

        { // 说明该col列第k行以下全是0了,则处理当前行的下一列.
            k--; continue;
        }

        for (i = k + 1; i < equ; i++)
        { // 枚举要删去的行.
            if (a[i][col] != 0)
            {
                LCM = lcm(abs(a[i][col]), abs(a[k][col]));
                ta = LCM / abs(a[i][col]), tb = LCM / abs(a[k][col]);
                if (a[i][col] * a[k][col] < 0) tb = -tb; // 异号的情况是两个数相加.
                for (j = col; j < var + 1; j++)
                {
                    a[i][j] = (a[i][j] * ta - a[k][j] * tb+10000)%2;
                }
            }
        }
    }


    // 3. 唯一解的情况: 在var * (var + 1)的增广阵中形成严格的上三角阵.

    // 计算出Xn-1, Xn-2 ... X0.

    for (i = var - 1; i >= 0; i--)

    {

        temp = a[i][var];

        for (j = i + 1; j < var; j++)

        {

            if (a[i][j] != 0) temp -= a[i][j] * x[j];

        }



        if(a[i][i]) x[i] = temp / a[i][i]; else x[i]=0;
		x[i]=(x[i]+10000)%2;
    }


}

 
int di[]={0,1,0,-1};
int dj[]={1,0,-1,0};
bool inlim(int x,int y)
{
	if(x<0 || x>=5 || y<0 || y>=6) return false;
	return true;
}
int main()
{
	//freopen("input.txt","r",stdin);
	int cases,tc=0;
	scanf("%d",&cases);

	while(cases--)
	{
		tc++;
		printf("PUZZLE #%d\n",tc);
		memset(equ,0,sizeof equ);
		memset(ans,0,sizeof ans);
		for(int i=0;i<5;i++)
		{
			for(int j=0;j<6;j++)
			{
				scanf("%d",&equ[i*6+j][30]);
				equ[i*6+j][i*6+j]=1;
				for(int k=0;k<4;k++)
				{
					int ni=i+di[k];
					int nj=j+dj[k];
					if(inlim(ni,nj))
					{
						equ[i*6+j][ni*6+nj]=1;
					}
				}
			}
		}
		Gauss(30,equ,ans);
		for(int i=0;i<30;i++)
		{
			printf("%d",ans[i]);
			if((i+1)%6!=0) printf(" "); else printf("\n");
		}
	}
	//fclose(stdin);
	return 0;
}

Followed by:

Post your reply here:
User ID:
Password:
Title:

Content:

Home Page   Go Back  To top


All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator