您的位置:首页 > 其它

poj1222开关问题, 高斯消元

2015-12-14 18:20 417 查看
题意:

给个5X6的矩阵,只有0和1;

然后叫你将1全部翻成0;

理解:

直接就是开关问题啦...

枚举第一行的情况,推出所有...

不过我自己竟然没考虑到0的情况....

看讨论说可以用高斯消元法做;

但我并不会...得学习下;

看了大神的代码..发现高斯消元有点麻烦;

它是根据某坐标与其他坐标的关系来列方程;

共30个方程,30个未知数....

然后求唯一解;

这样的话我就觉得麻烦了.....

代码如下:

太冗长了...

#include <cstdio>
#include <cstring>

#include <algorithm>
#include <vector>

using namespace std;

vector<int> vec[6], puz[6], v_c[6];
int d[4][2] = {0, 1, 1, 0, -1, 0, 0, -1};

void pre(int x, int y)
{
v_c[x][y] = !v_c[x][y];
puz[x][y] = 1;
for (int j = 0; j < 4; ++j)
{
int nx = x + d[j][0];
int ny = y + d[j][1];
if (nx >= 0 && nx < 5 && ny >= 0 && ny < 6)
{
v_c[nx][ny] = !v_c[nx][ny];
}
}
}

bool OK(int m)
{
for (int i = 0; i < 5; ++i)
{
v_c[i].clear();
puz[i].clear();
for (int j = 0; j < 6; ++j)
{
puz[i].push_back(0);
v_c[i].push_back(vec[i][j]);
}
}
for (int i = 0; i < 6; ++i)
{
if (((1 << i) & m) != 0)
{
pre(0, i);
}
}
//for (int i = 0; i < 5; ++i) { for (int j = 0; j < 6; ++j) printf("%d ", v_c[i][j]);printf("\n");}
//printf("~~~~~~~~~~~~~~~~~~~~~~~~~~\n");
for (int i = 1; i < 5; ++i)
{
for (int j = 0; j < 6; ++j)
{
if (v_c[i - 1][j] == 1)
{
pre(i, j);
}
}
}
for (int i = 0; i < 6; ++i)
{
if (v_c[4][i] == 1)
{
return false;
}
}
for (int i = 0; i < 5; ++i)
{
for (int j = 0; j < 6; ++j)
{
printf("%d ", puz[i][j]);
}
printf("\n");
}
return true;
}

int main()
{
int t;
scanf("%d", &t);
for (int I = 1; I <= t; ++I)
{
for (int i = 0; i < 5; ++i)
{
vec[i].clear();
for (int j = 0; j < 6; ++j)
{
int num;
scanf("%d", &num);
vec[i].push_back(num);
}
}
printf("PUZZLE #%d\n", I);
for (int i = 0 ; i < (1 << 6); ++i)//0的情况....WA
{
if (OK(i))
{
break;
}
}
}

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  poj 开关问题