poj 1753 Flip Game(高斯消元)
来源:互联网 发布:超星视频跳过软件 编辑:程序博客网 时间:2024/06/07 11:24
和 poj 1681 Painter’s Problem 完全一样,http://blog.csdn.net/gyhguoge01234/article/details/78428118
#include <stdio.h>#include <string.h>#include <algorithm>using namespace std;//对2取模的01方程组const int MAXN = 300;//有equ个方程, var个变元。增广矩阵行数为equ,列数为var+1,分别为0到varint equ,var;int a[MAXN][MAXN]; //增广矩阵int x[MAXN]; //解集int free_x[MAXN];//用来存储自由变元(多解枚举自由变元可以使用)int free_num;//自由变元的个数//返回值为-1表示无解,为0是唯一解,否则返回自由变元个数int Gauss(){ int max_r,col,k; free_num = 0; for(k = 0, col = 0 ; k < equ && col < var ; k++, col++) { max_r = k; for(int i = k+1; i < equ; i++) { if(abs(a[i][col]) > abs(a[max_r][col])) max_r = i; } if(a[max_r][col] == 0) { k--; free_x[free_num++] = col;//这个是自由变元 continue; } if(max_r != k) { for(int j = col; j < var+1; j++) swap(a[k][j],a[max_r][j]); } for(int i = k+1; i < equ; i++) { if(a[i][col] != 0) { for(int j = col; j < var+1; j++) a[i][j] ^= a[k][j]; } } } for(int i = k; i < equ; i++) if(a[i][col] != 0) return -1;//无解 if(k < var) return var-k;//自由变元个数//唯一解,回代 for(int i = var-1; i >= 0; i--) { x[i] = a[i][var]; for(int j = i+1; j < var; j++) x[i] ^= (a[i][j] && x[j]); } return 0;}int n;void init(){ memset(a,0,sizeof(a)); memset(x,0,sizeof(x)); equ = n*n; var = n*n; for(int i = 0; i < n; i++) for(int j = 0; j < n; j++) { int t = i*n+j; a[t][t] = 1; if(i > 0)a[(i-1)*n+j][t] = 1; if(i < n-1)a[(i+1)*n+j][t] = 1; if(j > 0)a[i*n+j-1][t] = 1; if(j < n-1)a[i*n+j+1][t] = 1; }}int solve(){ int t = Gauss(); if(t == -1) return -1; else if(t == 0) { int ans = 0; for(int i = 0; i < n*n; i++) ans += x[i]; return ans; } else { //枚举自由变元 int ans = 0x3f3f3f3f; int tot = (1<<t); for(int i = 0; i < tot; i++) { int cnt = 0; for(int j = 0; j < t; j++) { if(i&(1<<j)) { x[free_x[j]] = 1; cnt++; } else x[free_x[j]] = 0; } for(int j = var-t-1; j >= 0; j--) { int idx; for(idx = j; idx < var; idx++) if(a[j][idx]) break; x[idx] = a[j][var]; for(int l = idx+1; l < var; l++) if(a[j][l]) x[idx] ^= x[l]; cnt += x[idx]; } ans = min(ans,cnt); } return ans; }}char str[30][30];int main(){ n = 4; init(); for(int i = 0; i < n; i++) { scanf("%s",str[i]); for(int j = 0; j < n; j++) { if(str[i][j] == 'b') a[i*n+j][n*n] = 0; else a[i*n+j][n*n] = 1; } } int res1 = solve(); init(); for(int i = 0; i < n; ++i) { for(int j = 0; j < n; ++j) if(str[i][j] == 'w') a[i*n+j][n*n] = 0; else a[i*n+j][n*n] = 1; } int res2 = solve(); if(res1 == -1 && res2 == -1) printf("Impossible\n"); else if(res1 == -1) printf("%d\n",res2); else if(res2 == -1) printf("%d\n",res1); else printf("%d\n",min(res1,res2)); return 0;}
阅读全文
0 0
- poj 1753 Flip Game(高斯消元)
- poj 1753 Flip Game(高斯消元)
- poj 1753 Flip Game 高斯消元
- [高斯消元] poj 1753 Flip Game
- poj 1753 Flip Game(高斯消元)
- POJ 1753 Flip Game (高斯消元)
- poj 1753 Flip Game (高斯消元)
- Flip Game - POJ 1753 高斯消元
- poj 1753 Flip Game 高斯消元
- POJ 1753(Flip Game)
- Flip Game(POJ 1753)
- Flip Game(POJ-1753)
- poj 1753 Flip Game
- poj 1753 Flip Game
- poj 1753 Flip Game
- poj 1753 Flip Game
- POJ 1753 Flip Game
- poj 1753 Flip Game
- orcacle数据库的安装和解除scott用户锁
- 212. Word Search II
- 文件上传的名称问题解决
- 飞翔的榴莲饼
- 玩命发展的共享单车市场,病了
- poj 1753 Flip Game(高斯消元)
- solo安装 及通过nginx转发实现二级域名访问
- 机器学习基石-08-1-Noise and Probabilistic Target
- 第几天
- 2017-11-3每日一练
- [dubbo]浅谈dubbo-架构解析
- hhuoj1317
- 洛谷 P3941 入阵曲
- 连续总结第二十五天