您的位置:首页 > 其它

poj 1222 高斯消元

2015-07-03 16:52 525 查看
第一次写高斯消元 -。-
题意很简单 就是是全部灯变暗,一盏灯开关会使周围的灯变化,初始状态给了。
每盏灯就是一个x ,A就是相关关系
就是求  Ax=B 的解
(自己写的模版有点搓,可以去别的文章去看看 优美点的)#include <iostream>
#include <stdio.h>
#include <string.h>
#include <algorithm>
#include <queue>
using namespace std;
#define MAXA 25005
#define MAXN 50005
#define LL long long
#define MOD 10000000000

int a[33][33];
int b[33][33];
int ans[33];
int mp[10][10];
int id[33];
int x[33];

int dx[]={0,-1,0,1,0};
int dy[]={1,0,-1,0,0};

void init()
{
int tmp=0;
memset(a,0,sizeof(a));
for(int i=0;i<5;i++)
{
for(int j=0;j<6;j++)
{
mp[i][j]=tmp++;
}
}
memset(a,0,sizeof(a));
for(int i=0;i<5;i++)
{
for(int j=0;j<6;j++)
{
for(int k=0;k<5;k++)
{
if(i+dx[k]<0||i+dx[k]>4||j+dy[k]<0||j+dy[k]>5)continue;

int nto=mp[i][j];
int to=mp[i+dx[k]][j+dy[k]];
a[nto][to]=1;
a[to][nto]=1;
}
}
}
}

int main()
{
int t,cas=1;
scanf("%d",&t);
init();
while(t--)
{
int tmp=0;

for(int i=0;i<30;i++)
{
id[i]=i;
for(int j=0;j<30;j++)
{
b[i][j]=a[i][j];
// printf("%d ",b[i][j]);
}
// printf("\n");
}

for(int i=0;i<5;i++)
{
for(int j=0;j<6;j++)
{
scanf("%d",&b[tmp++][30]);
}
}

for(int i=0;i<30;i++)
{
for(int j=i;j<30;j++)
{
if(b[j][i]!=0)
{
swap(b[j],b[i]);
// swap(id[i],id[j]);
break;
}
}
if(b[i][i]==0)continue;

for(int j=i+1;j<30;j++)
{
if(b[j][i]==0)continue;
for(int k=i;k<=30;k++)
{
b[j][k]=((b[j][k]-b[i][k])%2+2)%2;
}
}

}

for(int i=29;i>=0;i--)
{
int sum=0;
for(int j=i+1;j<30;j++)
{
sum=sum+ans[j]*b[i][j];
}
ans[i]=((b[i][30]-sum)%2+2)%2;
}
printf("PUZZLE #%d\n",cas++);
for(int i=0;i<5;i++)
{
for(int j=0;j<6;j++)
{
printf("%d ",ans[mp[i][j]]);
}
printf("\n");
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  poj 高斯消元