poj 1753 Flip Game (高斯消元)
2015-03-17 16:24
323 查看
题意:
给出一个4*4的方格,里面有黑色和白色的棋子,如果操作某个棋子,那么这个棋子以及这个棋子的四周会反转,由黑变白或由白变黑。求最小操作数,使得整个方块变成同色。
题解:
高斯消元,开关类问题,有可能有多解,所以要枚举自由变元找到最小解,分别对全变成黑色和全变成白色跑一边高斯消元,去最小值。
给出一个4*4的方格,里面有黑色和白色的棋子,如果操作某个棋子,那么这个棋子以及这个棋子的四周会反转,由黑变白或由白变黑。求最小操作数,使得整个方块变成同色。
题解:
高斯消元,开关类问题,有可能有多解,所以要枚举自由变元找到最小解,分别对全变成黑色和全变成白色跑一边高斯消元,去最小值。
#include<iostream> #include<math.h> #include<stdio.h> #include<algorithm> #include<string.h> #include<vector> #include<queue> #include<map> #include<set> using namespace std; #define B(x) (1<<(x)) typedef long long ll; void cmax(int& a,int b){if(b>a)a=b;} void cmin(int& a,int b){if(b<a)a=b;} const int oo=0x3f3f3f3f; const ll OO=1LL<<61; const int MOD=10007; const int maxn=20; int maze[maxn][maxn]; int x[maxn],fx[maxn]; char str[maxn][maxn]; int Gauss(int n,int m){ int r,c,num=0; for(r=0,c=0;r<n&&c<m;r++,c++){ int t=r; for(int i=r+1;i<n;i++){ if(maze[i][c]>maze[t][c]) t=i; } if(t!=r){ for(int j=c;j<=m;j++) swap(maze[t][j],maze[r][j]); } if(maze[r][c]==0){ r--; fx[num++]=c; continue; } for(int i=r+1;i<n;i++){ if(maze[i][c]!=0){ for(int j=c;j<=m;j++){ maze[i][j]^=maze[r][j]; } } } } for(int i=r;i<n;i++){ if(maze[i][c]!=0) return -1; } ///枚举自由变元 int S=B(c-r),cnt,ans=oo; for(int s=0;s<=S;s++){ int st=s; cnt=0; for(int i=0;i<c-r;i++){ x[fx[i]]=st&1; if(x[fx[i]])cnt++; st>>=1; } for(int i=r-1;i>=0;i--){ int k=0; while(maze[i][k]==0)k++; x[k]=maze[i][m]; for(int j=k+1;j<m;j++) x[k]^=(maze[i][j]&&x[j]); if(x[k])cnt++; } cmin(ans,cnt); } return ans; } void Init(int n,int m){ memset(maze,0,sizeof maze); memset(x,0,sizeof x); for(int i=0;i<n;i++){ for(int j=0;j<m;j++){ int t=i*m+j; maze[t][t]=1; if(i>0)maze[(i-1)*m+j][t]=1; if(i<n-1)maze[(i+1)*m+j][t]=1; if(j>0)maze[i*m+j-1][t]=1; if(j<m-1)maze[i*m+j+1][t]=1; } } } bool input(int n){ for(int i=0;i<n;i++) if(scanf("%s",str[i])==EOF) return false; return true; } void solve(int n){ Init(n,n); for(int i=0;i<n;i++){ for(int j=0;j<=n;j++){ maze[i*n+j][n*n]=(str[i][j]!='b'); } } int ans1=Gauss(n*n,n*n); Init(n,n); for(int i=0;i<n;i++){ for(int j=0;j<n;j++){ maze[i*n+j][n*n]=(str[i][j]=='b'); } } int ans2=Gauss(n*n,n*n); if(ans1==-1&&ans2==-1)printf("Impossible\n"); else printf("%d\n",min(ans1,ans2)); } int main(){ //#define ON 1 #ifdef ON freopen("G:\\read.txt","r",stdin); #endif // ON while(input(4)){ solve(4); } return 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(枚举变元的高斯消元)
- poj1753-Flip Game(高斯消元枚举xor线性方程自由变元的值,找为1解的最少数量)
- poj 1753 Flip Game 高斯消元 异或方程组 求最值
- poj1753--Flip Game(高斯消元问题2,枚举自由元的首杀)
- 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(高斯消元)
- [置顶] POJ 1753 Flip Game(高斯消元入门超详细题解)——Northeastern Europe 2000
- poj 1753 Flip Game 高斯消元
- POJ 1753 Flip Game 高斯消元 枚举自由变量