运算符专项练习

江西省萍乡中学

/

练习题库

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("\n");
    while (t-->0){
        int i,j;
        memset(a,0,sizeof(a));
        ref(i,1,n){
            ref(j,1,m){
                cin>>c[i][j];
            }
            scanf("\n");
        }
        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*/
时间: 2024-08-30 14:42:19

运算符专项练习的相关文章

java中的三元运算符详解

最近在带领实习生中遇到很多新手问与三元运算符有关的java题目,多数为代码结果题,少数为应用题.鉴于很多资料上对于java三元运算的讲解过于简单,网上的资料与题目也不是很完善,对于结果答案分析不一,故在此总结,当然仅为个人观点,水平有限,不足之处,还请大家多多指出,互相交流学习. 什么是java三元运算符呢?无疑其操作元有三个,第一个是条件表达式,剩余两个为值,条件表达式为真时运算取第一个值,为假时取第二个值. 其示例代码如下:boolean a = 20 < 45 ? true : false

Mysql运算符与函数(胖胖老师)

use test;create table `employee`(    emp_no int unsigned,    emp_name varchar(30),    emp_sex varchar(3),    emp_age tinyint unsigned,    sal double,    history datetime);insert into employee values(1, '张三', '男', 18, 5000, '2012-04-23'),(2, '李四', '男'

MySQL数据库中的算术运算符

MySQL数据库中的算数运算符 MySQL数据库中的算术运算符 一.运算符的概述: 运算符在MySQL数据库中也是很重要的知识体,在执行sql语句的时候这个运算符对操作数据帮助很大.其中运算符的运用可以帮助你减省大量的时间,操作起来也比较灵活. 二.运算符 运算符主要包括"算数运算符"."比较运算符"."罗运算符"."位运算符"四大类,下面我们就一次学习一下. 1.算术运算符 算术运算符在sql语句的时候经常使用,例如对表的字

重载&gt;&gt;运算符

#include <iostream>   #include <stdio.h>   using namespace std;   class Input   {       public:          //实际重载是右移运算符          Input & operator >> (int &a)          {              scanf("%d",&a);              fflush

JS中的运算符&amp;JS中的分支结构

一.JS中的运算符 1.算术运算(单目运算符) + 加.- 减.* 乘./ 除.% 取余.++ 自增.-- 自减 >>> +:有两种作用,连接字符串/加法运算.当+两边全为数字时,进行加法运算: 当+两边有任意一边为字符串时,起连接字符串的作用,连接之后的结果为字符串 除+外,其余符号运算时,会先尝试将左右变量用Number函数转为数字 >>> /: 结果会保留小数点 >>> ++: 自增运算符,将变量在原有基础上+1: --: 自减运算符,将变量在原

java基础语言 运算符

/* ++,--运算符的使用: 单独使用: 放在操作数的前面和后面效果一样.(这种用法是我们比较常见的) 参与运算使用: 放在操作数的前面,先自增或者自减,然后再参与运算. 放在操作数的后面,先参与运算,再自增或者自减. 作用:就是对变量进行自增1或者自减1. */ public class Text3 { public static void main(String[] args) { //定义两个变量 int x = 3; int y = 4; //单独使用 //x++; //y--; ++

集合和三元运算符

一.三元运算符 如下判断可以使用三元运算更方便的实现: a = 1b = 2 if a > 1: c = aelse: c = b 和下面是一样的: a = 1b = 2#下面这个c = a if a>1 else b 如下两种方法也是一样的:方式一: s=[]nums = list(range(1,11))for i in nums: if i%2==0: s.append(i)print(s)方式二:ss = [i for i in nums if i%2==0]print(ss)#这两种

2_C语言中的数据类型 (八)运算符

1          运算符表达式和语句 1.1       基本运算符 1.1.1          = 数据对象:泛指数据在内存的存储区域 左值:表示可以被更改的数据对象 右值:能赋给左值的量 1.1.2          + 加 1.1.3          – 减 1.1.4          * 乘 1.1.5          / 除 1.1.6          % 取余数 1.1.7          += 加等于 1.1.8          -= 减等于 1.1.9     

(17)Powershell中的重定向运算符

默认情况下,Powershell 把输出发送到屏幕显示.但是,Powershell也可以将输出重定向至一个文本文件,或将错误输出重定向至常规输出流. 重定向运算符有什么用 ? 重定向运算符意味着我们可以将命令的输出信息输出到指定的文件,完全满足脚本中的log的要求,即可以利用重定向打印脚本或命令执行的详细信息. Powershell 中有以下重定向运算符. 运算符 说明 示例 > 将输出发送到指定文件. PS D:\> Get-Process > process.txt >>