poj 1681 Painter's Problem(高斯消元法)

来源:互联网 发布:windows一键还原软件 编辑:程序博客网 时间:2024/05/18 13:47

Description

There is a square wall which is made of n*n small square bricks. Some bricks are white while some bricks are yellow. Bob is a painter and he wants to paint all the bricks yellow. But there is something wrong with Bob's brush. Once he uses this brush to paint brick (i, j), the bricks at (i, j), (i-1, j), (i+1, j), (i, j-1) and (i, j+1) all change their color. Your task is to find the minimum number of bricks Bob should paint in order to make all the bricks yellow. 

Input

The first line contains a single integer t (1 <= t <= 20) that indicates the number of test cases. Then follow the t cases. Each test case begins with a line contains an integer n (1 <= n <= 15), representing the size of wall. The next n lines represent the original wall. Each line contains n characters. The j-th character of the i-th line figures out the color of brick at position (i, j). We use a 'w' to express a white brick while a 'y' to express a yellow brick.

Output

For each case, output a line contains the minimum number of bricks Bob should paint. If Bob can't paint all the bricks yellow, print 'inf'.

Sample Input

23yyyyyyyyy5wwwwwwwwwwwwwwwwwwwwwwwww

Sample Output

015

Source

POJ Monthly--2004.06.27 张嘉龄


题意:

一个n*n 的木板 ,每个格子 都 可以 染成 白色和黄色,( 一旦我们对也个格子染色 ,他的上下左右 都将改变颜色);

给定一个初始状态 , 求将 所有的 格子 染成黄色 最少需要染几次?  若 不能 染成 输出 inf。

 

思路:高斯消元法,可以参照poj1222,只是要判断是否无解;


代码:

#include<cstdio>#include<cstring>#include<algorithm>#include<cmath>using namespace std;const int N=15;char map[N][N];int a[N*N][N*N+N];int x[N*N];void init(int n){    memset(a,0,sizeof(a));    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 Gauss(int n){    int col=0;    int k;    for(k=0;k<n,col<n;k++,col++)    {        int max_r=k;        for(int i=k+1;i<n;i++)            if(abs(a[max_r][col])<abs(a[i][col]))                 max_r=i;        if(max_r!=k)            for(int i=col;i<=n;i++)                swap(a[max_r][i],a[k][i]);        if(a[k][col]==0)        {            k--;continue;        }        for(int i=k+1;i<n;i++)        {            if(a[i][col])                for(int j=col;j<=n;j++)                    a[i][j]^=a[k][j];        }    }    for(int i=k;i<n;i++)        if(a[i][n]!=0) return -1;    for(int i=n-1;i>=0;i--)    {        x[i]=a[i][n];        for(int j=i+1;j<=n;j++)            x[i]^=(x[j]&&a[i][j]);    }    return 0;}int main(){    int t;    scanf("%d",&t);    while(t--)    {        int n;        scanf("%d",&n);        for(int i=0;i<n;i++)            scanf("%s",map[i]);        init(n);        for(int i=0;i<n;i++)            for(int j=0;j<n;j++)                if(map[i][j]=='y')                    a[i*n+j][n*n]=0;                else                    a[i*n+j][n*n]=1;        memset(x,0,sizeof(x));        int ans=Gauss(n*n);        if(ans==-1)            printf("inf\n");        else        {            for(int i=0;i<n*n;i++)                if(x[i]==1) ans++;            printf("%d\n",ans);        }    }}




0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 安卓不支持flash了怎么办 看视频要加载flash怎么办 下水道管子铁皮破了怎么办 炸金花牌一样大怎么办 玩棋牌游戏输了怎么办 苹果7插耳机外放怎么办 出国种菠菜抓了怎么办 在菲做菠菜抓到怎么办 3串1中两个怎么办 微博账号封停怎么办 阴阳师账号被永久封停怎么办 寒刃2账号被禁用怎么办 输了好多钱我该怎么办 亲朋打鱼别处在玩怎么办 做糯米蛋的蛋清怎么办 水田地没耙地平怎么办 宝宝拉鸡蛋花样大便怎么办 电子琴伴奏区无旋律音怎么办 手机触摸屏摔坏了怎么办 手机充着电玩游戏卡怎么办? 4个月宝宝拉肚子怎么办 6个月宝宝上火怎么办 1月婴儿大便干燥怎么办 椰子鞋350线开了怎么办 打完篮球小腿肌肉酸痛怎么办 衣服穿少了感冒怎么办 侧手翻翻不过去怎么办 生完孩子胯宽了怎么办 小孩户口性质弄错了怎么办 4岁宝宝咳嗽很厉害怎么办 宝宝深夜咳嗽很厉害怎么办 2岁宝宝发热37.6怎么办 篮球气嘴慢跑气怎么办 4个月宝宝偏胖怎么办 4个月婴儿偏胖怎么办 6岁儿童偏胖怎么办 打篮球撞到头颈椎痛怎么办 血燥热引起的皮肤瘙痒怎么办 坐时间久了屁股疼怎么办 屁股坐久了疼怎么办 屁股坐久了痛怎么办