zoukankan      html  css  js  c++  java
  • 运算符专项练习

    1003:玩诈欺的小杉

    总时间限制:
    500000ms
    内存限制:
    65536kB
    描述
    小杉的幻想来到了经典日剧《诈欺游戏》的场景里……
    他正在参加诈欺游戏的第四回合。话说第四回合不就是“人生”吗……总之,无论如何,小杉身为新一代的松田翔太,必须要赢得这场游戏!第四回合的参赛者只有一个人,庄家贝洛尼亚告诉了小杉第四回合的游戏。
    是这样的,在小杉的面前有一个N行M列的棋盘,棋盘上有N*M个有黑白棋的棋子(一面为黑,一面为白),一开始都是白面朝上。
    小杉可以对任意一个格子进行至多一次的操作(最多进行N*M个操作),该操作使得与该格同列的上下各2个格子以及与该格同行的左右各1个格子以及该格子本身翻面。
    例如,对于一个5*5的棋盘,仅对第三行第三列的格子进行该操作,得到如下棋盘(0表示白面向上,1表示黑面向上)。

    00100
    00100
    01110
    00100
    00100

    对一个棋盘进行适当的操作,使得初始棋盘(都是白面朝上)变成已给出的目标棋盘的操作集合称作一个解法。
    小杉的任务是:对给出的目标棋盘,求出所有解法的总数。
    输入
    每组测试数据的第一行有3个正整数,分别是N、M和T(1<=N、M<=20,1<=T<=5)
    接下来T个目标棋盘,每个目标棋盘N行,每行M个整数之前没有空格且非0即1,表示目标棋盘(0表示白面朝上,1表示黑面朝上);两个目标棋盘之间有一个空行。
    特别地,对于30%的数据,有1<=N、M<=15。
    输出
    对每组数据输出T行,每行一个整数,表示能使初始棋盘达到目标棋盘的解法总数。
    样例输入
    4 4 2
    0010
    0010
    0111
    0010
    
    0010
    0110
    0111
    0010
    
    样例输出
    1
    1
    
    提示
    样例解释 Sample Explanation:
    对于输入的数据,两个目标棋盘各有一种解法:
    1:
    0000
    0000
    0010
    0000
    2:
    1011
    1101
    0111
    1011
    其中1表示对该格进行操作,0表示不操作。

    Death or alive.
    命运掌握在自己手中.

    全局题号
    3951
    添加于
    2011-09-28
    提交次数
    6
    尝试人数
    3
    通过人数
    3

    你的提交记录

    # 结果 时间
    1 Accepted 06-06
    #include<cstdio>
    #include<cstring>
    #include<iostream>
    #define ref(i,a,b) for(i=a;i<=b;i++)
    using namespace std;
    int a[22],n,m,t;
    char c[22][22];
    int main()
    {   
        cin>>n>>m>>t;
        scanf("
    ");
        while (t-->0){
            int i,j;
            memset(a,0,sizeof(a));
            ref(i,1,n){
                ref(j,1,m){
                    cin>>c[i][j];
                }
                scanf("
    ");
            }
            int v;
            ref(j,1,m){
                v=1;
                ref(i,1,n){//我是把整个图顺时针转了90度,更好操作
                    a[j]+=v*(c[i][j]-48);//二进制转换成十进制状态
                    v*=2;
                }
            }
            int ans=0,k,b[21],al=(1<<n)-1;
            ref(a[0],0,al){
                ref(i,0,m) b[i]=a[i];
                ref(i,1,m){
                    b[i]=(b[i]^(b[i-1]*2)^(b[i-1]*4)^(b[i-1]/4)^(b[i-1]/2)^b[i-1])&al; //操作当前的状态
                    b[i+1]=(b[i+1]^b[i-1])&al;//操作下一状态
                }
                if ((b[m]&al)==0) 
                ans++;
            }
            cout<<ans<<endl;
        }
        return 0;
    }
    /*http://blog.csdn.net/hzj1054689699/article/details/50571564*/
  • 相关阅读:
    165. Compare Version Numbers
    164. Maximum Gap
    3、桶排序
    162. Find Peak Element
    160. Intersection of Two Linked Lists
    155. Min Stack
    154. Find Minimum in Rotated Sorted Array II
    153. Find Minimum in Rotated Sorted Array
    Linux/Unix系统编程手册 第二章:基本概念
    Linux/Unix系统编程手册 第一章:历史和标准
  • 原文地址:https://www.cnblogs.com/shenben/p/5564136.html
Copyright © 2011-2022 走看看