http://poj.org/problem?

id=1681

求最少经过的步数使得输入的矩阵全变为y。


思路:高斯消元求出自由变元。然后枚举自由变元,求出最优值。

注意依据自由变元求其它解及求最优值的方法。


#include <stdio.h>
#include <algorithm>
#include <set>
#include <map>
#include <vector>
#include <math.h>
#include <string.h>
#define LL long long
#define _LL __int64using namespace std;
const int INF = 0x3f3f3f3f;char mapp[17][17];
int a[16*16][16*16];
int equ,var;
int x[16*16];
int free_x[16*16]; //保存自由变元,枚举求最优解
int free_num;void init()
{memset(a,0,sizeof(a));memset(x,0,sizeof(x));
}void debug()
{for(int i = 0; i < equ; i++){for(int j = 0; j < var+1; j++)printf("%d",a[i][j]);printf("\n");}
}int Gauss()
{int row,col,i,j;int max_r;row = col = 0;free_num = 0;while(row < equ && col < var){max_r = row;for(i = row+1; i < equ; i++){if( abs(a[i][col]) > abs(a[max_r][col]) )max_r = i;}if(max_r != row){for(j = col; j < var+1; j++)swap(a[max_r][j],a[row][j]);}if(a[row][col] == 0){free_x[ free_num++ ] = col; //该列相应的变量是自由元col++;continue;}for(i = row+1; i < equ; i++){if(a[i][col] == 0) continue;for(j = col; j < var+1; j++)a[i][j] ^= a[row][j];}row++;col++;}for(i = row; i < equ; i++)if(a[i][col] != 0)return -1; //无解if(row < var)return var-row; //返回自由变元的数目for(i = var-1; i >= 0; i--) //有唯一解{x[i] = a[i][var];for(j = i+1; j < var; j++)x[i] ^= (a[i][j] && x[j]);}return 0;
}void solve()
{int t = Gauss();if(t == -1){printf("inf\n");return;}else if(t == 0){int ans = 0;for(int i = 0; i < var; i++)ans += x[i];printf("%d\n",ans);return;}else{int ans = INF;int sta = (1<<t); //t个变量共同拥有sta个基础解int cnt;for(int i = 0; i < sta; i++){cnt = 0;//先给自由变元赋值for(int j = 0; j < t; j++){if((1<<j) & i){x[ free_x[j] ] = 1;cnt++;}elsex[ free_x[j] ] = 0;}//求出其它的解for(int j = var-t-1; j >= 0; j--){int l,k;for(k = j; k < var; k++)if(a[j][k])break; //先找到该行第一个不为0的数x[k] = a[j][var];for(l = k+1; l < var; l++)x[k] ^= (x[l] && a[j][l]);cnt += x[k];}ans = min(ans,cnt);}printf("%d\n",ans);return;}
}int main()
{int n,test;scanf("%d",&test);while(test--){init();scanf("%d",&n);equ = var = n*n;for(int i = 0; i < n; i++)scanf("%s",mapp[i]);for(int i = 0; i < n; i++){for(int j = 0; j < n; j++){if(mapp[i][j] == 'w')a[i*n+j][var] = 1;else a[i*n+j][var] = 0;}}for(int i = 0; i < equ; i++){int x = i/n;int y = i%n;for(int j = 0; j < var; j++){int xx = j/n;int yy = j%n;if( abs(x-xx) + abs(y-yy) <= 1)a[i][j] = 1;else a[i][j] = 0;}}solve();}return 0;
}




poj 1681 Painter#39;s Problem(高斯消元)相关推荐

  1. POJ 1222 1681 1830 3185 开关灯问题 (高斯消元 异或方程组)

    POJ 1222 EXTENDED LIGHTS OUT 基本的开关灯问题.还保证唯一解. 我们把每一个灯泡当成一个状态xi,总共有30个,而且每个灯与其他灯的关系也很明显.所以我们就可以列30方程3 ...

  2. POJ 1222 EXTENDED LIGHTS OUT(高斯消元)

    [题目链接] http://poj.org/problem?id=1222 [题目大意] 给出一个6*5的矩阵,由0和1构成,要求将其全部变成0,每个格子和周围的四个格子联动,就是说,如果一个格子变了 ...

  3. poj1681 Painter's Problem高斯消元

    链接http://poj.org/problem?id=1681 View Code 1 #include <stdio.h> 2 #include <string.h> 3 ...

  4. POJ 1830 开关问题 【01矩阵 高斯消元】

    任意门:http://poj.org/problem?id=1830 开关问题 Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 1 ...

  5. POJ 1753 Flip Game 高斯消元

    和1222,1681差不多 POJ 1222 高斯消元更稳 POJ 1681 高斯消元 枚举自由变元 equ = 16 ,var = 16的方程组 #include <cstdio> #i ...

  6. 高斯消元 zoj 3645 poj 1222/XOR消元

    double a[maxn][maxn] , x[maxn] ; //a[i][j] 系数矩阵 , a[i][n+1] = y[i] , x解 int n ; //n个方程 void guass(){ ...

  7. POJ 2947 Widget Factory (高斯消元解同余方程组)

    题意:N种物品,M条记录,接写来M行,每行有K,str1,str2,表示第i个记录从星期str1到星期str2,做了K件物品,接下来的K个数为物品的编号.求做每个物品所需的时间,并且最后结果在3-9之 ...

  8. poj 1830 开关问题 高斯消元

    题目链接 高斯消元模板, 判断是否有解以及变元的数量. 1 #include <iostream> 2 #include <vector> 3 #include <cst ...

  9. POJ 1166 The Clocks (爆搜 || 高斯消元)

    题目链接 题意: 输入提供9个钟表的位置(钟表的位置只能是0点.3点.6点.9点,分别用0.1.2.3)表示.而题目又提供了9的步骤表示可以用来调正钟的位置,例如1 ABDE表示此步可以在第一.二.四 ...

最新文章

  1. php 简繁体转换类库,OpenCC for PHP 优雅的简繁体转换
  2. 来来来,一起五句话搞定JavaScript作用域
  3. 带你了解C#每个版本新特性
  4. 第七节:框架搭建之页面静态化的剖析
  5. 阿里巴巴云原生混部系统 Koordinator 正式开源
  6. python输入二维数组_python 二维数组键盘输入
  7. AndroidStudio安卓原生开发_android.view.WindowManager$BadTokenException: Unable to add---Android原生开发工作笔记129
  8. 中国喷淋泵行业市场供需与战略研究报告
  9. C/C++ 进程间通信 管道
  10. Javascript 专项练习
  11. C语言ctype常用方法
  12. 《一直在路上》系列——大美贵州,贵州避暑之旅
  13. 仿新浪微博的ListView下拉更新功能
  14. Android有线投屏实践
  15. MongoDB 文档数据库【进阶】
  16. java数组的下界,Java泛型_上界extends_下界super
  17. 拓扑排序在实际项目中应用
  18. 5.2.2、方法重写与隐藏
  19. 给程序员做几年老婆后的心得
  20. c语言微博创建转发和删除源代码,[转]QQ空间、新浪微博、腾讯微博等一键分享API链接代码...

热门文章

  1. JAVA面向对象-----final关键字
  2. Kotlin语法(基础)
  3. 避免死锁的一些注意事项
  4. git revert和git reset的区别
  5. 北斗时钟在国内各行业的应用前景
  6. 如何从sdcard读取文件
  7. [转]控制 Cookie 的作用范围
  8. swift实现ios类似微信输入框跟随键盘弹出的效果
  9. 看linux书籍做的一些重要笔记(2011.07.03更新)
  10. 用Servlet获取表单数据