您的位置:首页 > 其它

POJ 1830 开关问题

2012-05-11 16:03 239 查看
POJ_1830

可以用高斯消元求矩阵的秩,这样就知道了有x个变元,而这些变元可以取任意值,对于每种情况,其他元会有唯一的解,所以一共就有2^x种方案。

#include<stdio.h>
#include<string.h>
#include<iostream>
#define MAXD 35
using namespace std;
int N, mat[MAXD][MAXD];
void init()
{
int i, j, k;
memset(mat, 0, sizeof(mat));
scanf("%d", &N);
for(i = 0; i < N; i ++)
scanf("%d", &mat[i]
);
for(i = 0; i < N; i ++)
{
scanf("%d", &k);
mat[i]
^= k;
mat[i][i] = 1;
}
for(;;)
{
scanf("%d%d", &i, &j);
if(!i && !j)
break;
mat[j - 1][i - 1] = 1;
}
}
int gauss()
{
int i, j, k, x, y;
for(i = j = 0; j < N; i ++, j ++)
{
if(mat[i][j] == 0)
{
for(k = i + 1; k < N; k ++)
if(mat[k][j])
break;
if(k == N)
{
-- i;
continue;
}
for(y = j; y <= N; y ++)
swap(mat[i][y], mat[k][y]);
}
for(x = i + 1; x < N; x ++)
if(mat[x][j])
{
for(y = j; y <= N; y ++)
mat[x][y] ^= mat[i][y];
}
}
for(x = i; x < N; x ++)
if(mat[x]
)
return -1;
return 1 << (N - i);
}
void solve()
{
int ans = gauss();
if(ans == -1)
printf("Oh,it's impossible~!!\n");
else
printf("%d\n", ans);
}
int main()
{
int t;
scanf("%d", &t);
while(t --)
{
init();
solve();
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: