poj 1753

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int map1[230][230], ans, n, m;
int dir[4][2] = {0,1,0,-1,1,0,-1,0};

int gauss()
{
    int i,j,k,t;
    for(i=0,j=0; i<n && j<n; i++,j++)
    {
        k=i;
        while(!map1[k][j] && k<n)
            k++;

        if(k==n)
        {
            i--;
            continue;
        }

        if(k!=i)
            for(t = j; t <= n; t++)
                swap(map1[i][t],map1[k][t]);
        for(k=i+1; k < n; k++)
            if(map1[k][j])
                for(t=j; t<=n; t++)
                    map1[k][t]^=map1[i][t];
    }
    k=i;
    for(i=k; i<n; i++)
    {
        if(map1[i][n])
            return -1;
        //while(1);
    }
    for(i=k-1,t=0; i >= 0; i--)
    {
        for(j=i+1; j<n; j++)
            map1[i][n]^=(map1[i][j]&&map1[j][n]);
        if(map1[i][n]) t++;
    }
    return t;
}

int main()
{
    int cas, i, j, ans;
    char c;
    scanf("%d", &cas);
    while (cas--)
    {
        scanf("%d", &m);
        memset(map1, 0, sizeof (map1));
        n = m*m;
        for (i = 0; getchar(), i < m; i++)
            for (j = 0; j < m; j++)
            {
                c = getchar();
                if (c == ‘w‘)
                    map1[i * m+j][n] = 1;
                else
                    map1[i * m+j][n] = 0;
            }
        for (i = 0; i < m; i++)
            for (j = 0; j < m; j++)
            {
                map1[i*m+j][i*m+j]=1;
                for(int k=0; k<4; k++)
                {
                    int dx=i+dir[k][0],dy=j+dir[k][1];
                    if(dx>=0 && dx<m && dy>=0 && dy<m)
                        map1[dx*m+dy][i*m+j]=1;
                }
            }
        ans=gauss();
        if(ans==-1)
            printf("inf\n");
        else
            printf("%d\n",ans);
    }
    return 0;
}
/*
5
4
wwww
wwww
wwww
wwww
5
result 4 but compute result is 10 . this is because free radical is not enum.
*/
时间: 2024-12-28 09:47:31

poj 1753的相关文章

[ACM训练] 算法初级 之 基本算法 之 枚举(POJ 1753+2965)

先列出题目: 1.POJ 1753 POJ 1753  Flip Game:http://poj.org/problem?id=1753 Sample Input bwwb bbwb bwwb bwww Sample Output 4 入手竟然没有思路,感觉有很多很多种情况需要考虑,也只能使用枚举方法才能解决了吧~ 4x4的数组来进行数据存储的话操作起来肯定非常不方便,这里借用位压缩的方法来存储状态,使用移位来标识每一个位置的的上下左右的位置操作. 详细看这里. 1.当棋盘状态id为0(全白)或

POJ 1753 Flip Game(dfs+枚举)

POJ 1753 题意: 输入一个4*4的图像,由黑白两色组成,定义一种操作为:改变某个格子内小球的颜色(黑变白,白变黑),同时其上下左右的格子内小球也将变色.求最少多少次操作能使之成为纯色图案. 思路: 对一个格子操作偶数次等于没有操作,操作奇数次等于操作一次,所以答案在0~16以及impossible之间. 从n=0开始枚举n次操作可能的组成情况,即操作哪几个格子,若某种组合能变图案为纯色则停止. 由于总组合数达到2^16,故枚举组合情况可以用dfs来进行回溯枚举. //还有一种方法是位运算

POJ 1753 Flip Game (DFS + 枚举)

题目:http://poj.org/problem?id=1753 这个题在开始接触的训练计划的时候做过,当时用的是DFS遍历,其机制就是把每个棋子翻一遍,然后顺利的过了,所以也就没有深究. 省赛前一次做PC2遇到了几乎一模一样的题,只不过是把棋盘的界限由4X4改为了5X5,然后一直跑不出结果来,但是当时崔老湿那个队过了,在最后总结的时候,崔老湿就说和这个题一样,不过要枚举第一行进行优化. 我以为就是恢复第一行然后第二行以此类推,不过手推一下结果是6不是4,就知道这个有问题. 问了崔老湿,问了+

【POJ 1753】Flip Game

[POJ 1753]Flip Game 二进制+(BFS)暴力枚举 原本用二位字符数组存 发现遍历困难 并且翻动棋子也难办 后来想到一维线性 下标 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 在图中即为 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 预处理出一个数组进行翻转 后来又发现预处理难办 灵光一现 由于只有黑白两色 可用1 0标记 看到1 0想到的当然就是二进制了 并且又做成了个线性 刚好16位二进制 一切迎刃而解 翻转可

poj 1753 Flip Game (bfs + 枚举)

链接:poj 1753 题意:这是翻棋游戏,给定4*4棋盘,棋子一面为黑色(用b表示),另一面为白色(用w表示),问至少要几步可以将棋子翻为全黑或者全白,如不能达到目的,输出"Impossible " 翻转规则:可以选定16个棋子中的任意一个,将其本身以及上下左右相邻的翻转过来 分析:其实每格棋子最多只可以翻转一次(实际是奇数次,但与翻转一次状态一样),只要其中一格重复翻了2次(不论是连续翻动还是不连翻动),那么它以及周边的棋子和没翻动时的状态是一致的,与最初状态未翻转一样,由此就可以

POJ 1753 Flip Game (高斯消元 枚举自由变元求最小步数)

题目链接 题意:4*4的黑白棋,求把棋全变白或者全变黑的最小步数. 分析:以前用状态压缩做过. 和上题差不多,唯一的不同是这个终态是黑棋或者白棋, 但是只需要把给的初态做不同的两次处理就行了. 感觉现在还只是会套模板,不能独立的思考,好伤心.... 1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <cstdlib> 5 #include <cmath&g

[ACM] POJ 1753 Flip Game (枚举,BFS,位运算)

Flip Game Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 29921   Accepted: 12975 Description Flip game is played on a rectangular 4x4 field with two-sided pieces placed on each of its 16 squares. One side of each piece is white and the

POJ 1753 Flip Game (迭代递归)

POJ 1753,题目链接http://poj.org/problem?id=1753. POJ 1753,题目链接http://poj.org/problem?id=1753. 总共有16个点.对某个点选择操作或者不操作.一共有2^16次方种可能. 从前往后枚举,保证不重复. 1 #include<stdio.h> 2 #include<string.h> 3 #include<math.h> 4 #include<algorithm> 5 #includ

穷举(四):POJ上的两道穷举例题POJ 1411和POJ 1753

下面给出两道POJ上的问题,看如何用穷举法解决. [例9]Calling Extraterrestrial Intelligence Again(POJ 1411) Description A message from humans to extraterrestrial intelligence was sent through the Arecibo radio telescope in Puerto Rico on the afternoon of Saturday November 16

POJ 1753 Flip Game (状压+暴力)

题目链接:http://poj.org/problem?id=1753 题意: 给你一个4*4的棋盘,上面有两种颜色的棋子(一种黑色,一种白色),你一次可以选择一个棋子翻转它(黑色变成白色,同理反之),选择的这枚棋子的上下左右都会被翻动(前提是上下左右都可以被翻动).问最少可以翻动多少颗棋子,让整个棋盘变成全部黑色或者全部白色. 题解: 4*4一共就16个格子,每个格子都可以是翻或者不翻,那么就是216翻法. 所以就可以用状态压缩的方法来解决. 比如说47. 47的二进制是00101111,我们