• 运算符专项练习


    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*/
  • 相关阅读:
    AutoresizingMask草草草
    StoryBoard不使用AutoLayout情况下 按比例快速兼容适配iPhone6/6 Plus教程
    Unbalanced calls to begin/end appearance transitions for XXXX
    XCode常用快捷键
    Xcode使用心得01:断点中断问题和调整编译目标
    reloaddata 后不执行cellForRowAtIndexPath
    Xcode开发调试技巧—断点调试
    Xcode6 ADD Copy Files Build Phase 是灰色的,不能点问题
    duplicate symbols for architecture x86_64
    could not build module uikit
  • 原文地址:https://www.cnblogs.com/shenben/p/5564136.html
Copyright © 2020-2023  润新知