zoukankan      html  css  js  c++  java
  • POJ 1681 Painter's Problem (高斯消元)

    题目链接

    题意:有一面墙每个格子有黄白两种颜色,刷墙每次刷一格会将上下左右中五个格子变色,求最少的刷方法使得所有的格子都变成yellow。

    题解:通过打表我们可以得知4*4的一共有4个自由变元,那么我们枚举自由变元即可得知最优解。这个题的数据非常水,不枚举也能过。- -!

    代码:

    #include <iostream>
    #include <cstdio>
    #include <cmath>
    #include <cstring>
    #include <algorithm>
    #include <queue>
    #include <vector>
    #include <map>
    #include <ctime>
    using namespace std;
    const int maxn=300;
    //有equ个方程,var个变元。增广矩阵行数为equ,列数为var+1,分别为0到var
    int 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])
            {
                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])
                {
                    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])
        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;
        }
    }
    void solve()
    {
        int t=gauss();
        if(t==-1)
        {
            puts("inf");
            return ;
        }
        else if(t==0)
        {
            int ans=0;
            for(int i=0;i<n*n;i++)
            ans+=x[i];
            printf("%d
    ",ans);
            return ;
        }
        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);
            }
            printf("%d
    ",ans);
        }
    }
    char str[30][30];
    int main()
    {
        int t;
        scanf("%d",&t);
        while(t--)
        {
            scanf("%d",&n);
            init();
            for(int i=0;i<n;i++)
            {
                scanf("%s",str[i]);
                for(int j=0;j<n;j++)
                {
                    if(str[i][j]=='y')
                    a[i*n+j][n*n]=0;
                    else a[i*n+j][n*n]=1;
                }
            }
            solve();
        }
        return 0;
    }
  • 相关阅读:
    Django实现组合搜索
    KindEditor编辑器
    Python 使用Pillow模块生成验证码
    jenkins插件之如何优雅的生成版本号
    maven配置文件详解
    Django文件上传三种方式以及简单预览功能
    jsPlumb 学习笔记
    通用的业务编码规则设计实现[转:http://www.cnblogs.com/xqin/p/3708367.html]
    图解SQL的各种连接join[转]
    Redis配制说明
  • 原文地址:https://www.cnblogs.com/Ritchie/p/5837261.html
Copyright © 2011-2022 走看看