首页 > 其他分享 >POJ 1753 Flip Game (高斯消元)

POJ 1753 Flip Game (高斯消元)

时间:2023-04-13 23:40:36浏览次数:47  
标签:20 int 刚学 Game const include 1753 高斯消


题目地址:POJ 1753

第三次做这道题了。第一次是刚学搜索的时候做的,第二次是刚学状态压缩枚举的时候做的,这次是刚学高斯消元、、每次都做得很艰辛。。目测这题应该没了别的方法了吧。。。。。。

这题除了高斯消元外还需要枚举变元,方法是状态压缩枚举,然后返回去迭代解方程。

代码如下:


#include <iostream>
#include <string.h>
#include <math.h>
#include <queue>
#include <algorithm>
#include <stdlib.h>
#include <map>
#include <set>
#include <stdio.h>
using namespace std;
#define LL __int64
#define pi acos(-1.0)
const int mod=1e9+7;
const int INF=0x3f3f3f3f;
const double eqs=1e-6;
int mp[5][5], a[20][20], free_num, free_x[20], x[20];
int jx[]={0,0,1,-1};
int jy[]={1,-1,0,0};
int gauss()
{
        int i, j, k, free_num=0, h, tmp, t;
        for(i=0,j=0;i<16&&j<16;i++,j++){
                if(a[i][j]==0){
                        for(k=i+1;k<16;k++){
                                if(a[k][j]) break;
                        }
                        if(k==16){
                                free_x[free_num++]=j;
                                i--;
                                continue ;
                        }
                        for(h=j;h<17;h++){
                                swap(a[i][h],a[k][h]);
                        }
                }
                for(k=i+1;k<16;k++){
                        if(a[k][j]){
                                for(h=j;h<17;h++){
                                        a[k][h]^=a[i][h];
                                }
                        }
                }
        }
        tmp=i;
        for(j=i;j<16;j++){
                if(a[j][16]) return INF;
        }
        int ans=INF;
        int tot=1<<free_num;
        //printf("%d\n",free_num);
        for(i=0;i<tot;i++){
                int cnt=0;
                for(j=0;j<free_num;j++){
                        if(i&(1<<j)){
                                x[free_x[j]]=1;
                                cnt++;
                        }
                        else{
                                x[free_x[j]]=0;
                        }
                }
                //printf("%d\n",cnt);
                for(j=tmp-1;j>=0;j--){
                        t=0;
                        while(a[j][t]==0) t++;
                        x[t]=a[j][16];
                        for(k=t+1;k<16;k++){
                                if(a[j][k])  x[t]^=x[k];
                        }
                        cnt+=x[t];
                }
                //printf("%d\n",cnt);
                ans=min(ans,cnt);
        }
        return ans;
}
void init()
{
        memset(a,0,sizeof(a));
        for(int i=0;i<4;i++){
                for(int j=0;j<4;j++){
                        for(int k=0;k<4;k++){
                                int x=i+jx[k];
                                int y=j+jy[k];
                                if(x>=0&&x<4&&y>=0&&y<4){
                                        a[4*i+j][4*x+y]=1;
                                }
                        }
                        a[4*i+j][4*i+j]=1;
                }
        }
}
int main()
{
        char s[6];
        int i, j, k, x, y, ans1, ans2;
        for(i=0;i<4;i++){
                scanf("%s",s);
                for(j=0;j<4;j++){
                        if(s[j]=='b') mp[i][j]=0;
                        else mp[i][j]=1;
                }
        }
        init();
        for(i=0;i<4;i++){
                for(j=0;j<4;j++){
                        a[4*i+j][4*4]=mp[i][j];
                }
        }
        ans1=gauss();
        init();
        for(i=0;i<4;i++){
                for(j=0;j<4;j++){
                        a[4*i+j][4*4]=1-mp[i][j];
                }
        }
        ans2=gauss();
        if(ans1==INF&&ans2==INF){
                printf("Impossible\n");
        }
        else{
                printf("%d\n",min(ans1,ans2));
        }
        return 0;
}



标签:20,int,刚学,Game,const,include,1753,高斯消
From: https://blog.51cto.com/u_16070138/6188690

相关文章

  • POJ 1830 开关问题 (高斯消元)
    题目地址:POJ1830高斯消元第一发。一个地方逻辑判断出现了失误,调了一下午啊。。。通过高斯消元来找矩阵的秩,然后2^(自由元的数量)就是答案。因为对于每个自由元,都有0和1两种状态可选。代码如下:#include<iostream>#include<string.h>#include<math.h>#include<queue>#includ......
  • 一文读懂使用PyInstaller将Pygame库编写的小游戏程序打包为exe文件
    前言:​ 今天接了一个单子要求写一个基于pygame的贪吃蛇小游戏,打包成.exe文件。下面我就来教大家来python怎么打包文件,希望大家阅读这篇文章之后有所收获。下面看下通过Pyinstaller打包Pygame库写的小游戏程序出现的问题解决方法开发环境:Python:3.5.464位pyinstall:3.3.1一......
  • POJ 1753 Flip Game(bfs枚举+递推)
    题目地址:http://poj.org/problem?id=1753这题此前曾经做过,但当时是用的纯BFS做的,然后后来又做了一次组队赛,那是16*16的,果断超时超内存。。能超的都超了。。于是又找了个更好的方法,就是枚举第一行,然后后面的根据第一行的情况推下去。比如,你要让所有的都变成W,如果上一行的对应位置是B......
  • GAMES101笔记-01
    前言:这篇以及未来的一系列随笔是根据b站上的GAMES101现代计算机图形学入门课程所写的笔记,但笔记的篇章并非和课程一一对应。比如这篇对应的是第二课~第三课的内容。并且整理时不一定会将推导过程全部列出,做成只有总结概括的内容也不是没有可能。 1.向量叉乘的矩阵表示:  ......
  • 通过MenuItem在场景中生成GameObject
    MenuItemAttribute允许你在主菜单中添加新的选项。而这个菜单选项来自于一个静态函数。publicclassTestMenuItem{//Createsanewmenuitem'Examples>CreatePrefab'inthemainmenu.[MenuItem("TestMenuItem/CreatePrefab")]staticvoidCreatePrefa......
  • 高斯消元
    \(\color{black}高斯消元\)题意输入一个包含\(n\)个方程\(n\)个未知数的线性方程组。方程组中的系数为实数。求解这个方程组。下图为一个包含\(m\)个方程\(n\)个未知数的线性方程组示例:\[\left\{\begin{matrix}a_{1,1}\cdotx_1+a_{1,2}\cdotx_2+\dots+a_{......
  • 【模板】高斯消元
    #include<bits/stdc++.h>usingnamespacestd;constdoubleeps=1e-10;doubleuu,a[52][52],b[52];intn,l[52];boolpd;inlinevoidzzd(int&maxx,inti,intcnt){ for(intj=cnt+1;j<=n;++j){//找系数最大值 if(fabs(a[j][i])>fabs(a[maxx][i])) max......
  • UVA - 10905 Children's Game 字符串的排序
    题目大意:给出N个数字串,要求拼出有数字最大的串解题思路:用string就很好解决#include<cstdio>#include<cstring>#include<algorithm>#include<iostream>usingnamespacestd;constintmaxn=60;stringstr[maxn];intcmp(stringa,stringb){ returna+b>b+a;}......
  • JumpGame
    packageDynamicPlanning;/***55.跳跃游戏*给定一个非负整数数组nums,你最初位于数组的第一个下标。*数组中的每个元素代表你在该位置可以跳跃的最大长度。*判断你是否能够到达最后一个下标。*//***设想一下,对于数组中的任意一个位置y,我们如何判断它是......
  • python-Pygame 小游戏开发
    AIServoPlatformThisProjectisbaseontheraspberryhardwareplatformwhichbeusedforautomaticfacetrackandalsopersontrackfiledinthefuture.AITech.RaspberryProgramming.HardwareUpdate.1.StoveControlCodeimportpygamefrompygame.lo......