poj 1222  EXTENDED LIGHTS OUT

开关只有两种方案 按和不按,按两次相当于关

只用枚举第一排开关的按法即可,剩下的行为使上一排的灯全部关闭,按法可以确定,并且是唯一的。

最后检查最后一行是否都为0,都为0为可行的方案。  用位运算来实现。

#include <iostream>
#include <stdio.h>
#include <cstring>
using namespace std; char ol[], l[], r[];
int t; int getBit(char c, int i)
{
return & (c>>i);
} void setBit(char &c, int i, int v)
{
if (v) {
c |= ( << i);
}
else
c &= ~( << i);
} void FlipBit(char &c, int i)
{
c ^= ( << i);
} void output()
{
cout << "PUZZLE #" << t << endl;
for (int i = ; i < ; i++) {
for (int j = ; j < ; j++) {
cout << getBit(r[i], j);
if (j < )
cout << " ";
}
cout << endl;
}
} int main()
{
//freopen("1.txt", "r", stdin);
int T;
cin >> T;
for (t = ; t <= T; t++) {
for (int i = ; i < ; i++)
for (int j = ; j < ; j++) {
int s;
cin >> s;
setBit(ol[i], j, s);
} for (int n = ; n < ; n++) { //枚举第一列方案0~2^6-1
memcpy(l, ol, sizeof(ol));
int switchs = n; //当前行的开关状态
for (int i = ; i < ; i++) {
r[i] = switchs;
for (int j = ; j < ; j++) {
if (getBit(switchs, j)) {
if (j > )
FlipBit(l[i], j-);
FlipBit(l[i], j);
if (j < )
FlipBit(l[i], j+);
}
}
if (i < )
l[i+] ^=switchs;
switchs = l[i]; //i+1行灯的状态由第i行灯的状态决定
}
if (l[] == ) {
output();
break;
}
}
} return ;
}

特殊密码锁

描述

有一种特殊的二进制密码锁,由n个相连的按钮组成(n<30),按钮有凹/凸两种状态,用手按按钮会改变其状态。

然而让人头疼的是,当你按一个按钮时,跟它相邻的两个按钮状态也会反转。当然,如果你按的是最左或者最右边的按钮,该按钮只会影响到跟它相邻的一个按钮。

当前密码锁状态已知,需要解决的问题是,你至少需要按多少次按钮,才能将密码锁转变为所期望的目标状态。

输入两行,给出两个由0、1组成的等长字符串,表示当前/目标密码锁状态,其中0代表凹,1代表凸。输出至少需要进行的按按钮操作次数,如果无法实现转变,则输出impossible。

样例输入

011
000

样例输出

1

类似的思想,枚举第一个的状态,两种可能,那剩下的就可以唯一确定了,最后检查最后一位即可
#include <iostream>
#include <stdio.h>
#include <cstring>
#include <string>
using namespace std;
#define INF 0x3f3f3f3f
int src, des, r, t;
int ans; int getBit(int c, int i)
{
return & (c >> i);
} void setBit(int &c, int i, int v)
{
if (v)
c |= ( << i);
else
c &= ~( << i);
} void flipBit(int &c, int i)
{
c ^= ( << i);
} int main()
{
//freopen("1.txt", "r", stdin);
string a;
cin >> a;
int len = a.length();
for (int i = ; i < len; i++)
setBit(src, i, a[i]-''); cin >> a;
for (int i = ; i < len; i++)
setBit(des, i, a[i]-''); int Min, cnt;
for (int p = ; p < ; p++) {
Min = INF; cnt = ;
t = src;
if (p) {
flipBit(t, );
flipBit(t, );
cnt++;
}
for (int i = ; i < len; i++) {
if (getBit(t, i-) != getBit(des, i-)) {
cnt++;
flipBit(t, i);
if (i < len-)
flipBit(t, i+);
}
}
if (getBit(t, len-) == getBit(des, len-)) {
if (cnt < Min) {
Min = cnt;
ans = cnt;
}
}
}
if (Min == INF)
cout << "impossible";
else
cout << ans; return ;
}

poj 1166 拨钟问题

有9个时钟,排成一个3*3的矩阵。

|-------|    |-------|    |-------|
| | | | | | |
|---O | |---O | | O |
| | | | | |
|-------| |-------| |-------|
A B C |-------| |-------| |-------|
| | | | | |
| O | | O | | O |
| | | | | | | | |
|-------| |-------| |-------|
D E F |-------| |-------| |-------|
| | | | | |
| O | | O---| | O |
| | | | | | | |
|-------| |-------| |-------|
G H I
(图 1)

现在需要用最少的移动,将9个时钟的指针都拨到12点的位置。共允许有9种不同的移动。如下表所示,每个移动会将若干个时钟的指针沿顺时针方向拨动90度。

移动    影响的时钟

 1         ABDE
2 ABC
3 BCEF
4 ADG
5 BDEFH
6 CFI
7 DEGH
8 GHI
9 EFHI

输入9个整数,表示各时钟指针的起始位置,相邻两个整数之间用单个空格隔开。其中,0=12点、1=3点、2=6点、3=9点。输出输出一个最短的移动序列,使得9个时钟的指针都指向12点。按照移动的序号从小到大输出结果。相邻两个整数之间用单个空格隔开。样例输入

3 3 0
2 2 2
2 1 2

样例输出

4 5 8 9 

每个钟表有4种拨法,且与顺序无关,枚举即可 4^9种可能
#include <iostream>
#include <stdio.h>
#include <cstring>
using namespace std;
#define INF 0x3f3f3f3f;
int ori[][], s[][];
int t[]; bool ok()
{
for (int i = ; i <=; i++) {
for (int j = ; j <=; j++) {
if (s[i][j])
return ;
}
}
return ;
}
int main()
{
//freopen("1.txt", "r", stdin);
for (int i = ; i <= ; i++)
for (int j = ; j <= ; j++)
cin >> ori[i][j]; int Min = INF;
for (int i1 = ; i1 < ; i1++)
for (int i2 = ; i2 < ; i2++)
for (int i3 = ; i3 < ; i3++)
for (int i4 = ; i4 < ; i4++)
for (int i5 = ; i5 < ; i5++)
for (int i6 = ; i6 < ; i6++)
for (int i7 = ; i7 < ; i7++)
for (int i8 = ; i8 < ; i8++)
for (int i9 = ; i9 < ; i9++) {
memcpy(s, ori, sizeof(ori)); //每种枚举情况都是独立的
s[][] = (s[][]+i1+i2+i4)%; //A
s[][] = (s[][]+i1+i2+i3+i5)%;//B
s[][] = (s[][]+i2+i3+i6)%;//C
s[][] = (s[][]+i1+i4+i5+i7)%;//D
s[][] = (s[][]+i1+i3+i5+i7+i9)%;//E
s[][] = (s[][]+i3+i5+i6+i9)%;//F
s[][] = (s[][]+i4+i7+i8)%;//G
s[][] = (s[][]+i5+i7+i8+i9)%;//H
s[][] = (s[][]+i6+i8+i9)%;//I
if (ok()) {
int tot = i1+i2+i3+i4+i5+i6+i7+i8+i9;
// cout << tot << endl;
if (tot < Min) {
Min = tot;
t[] = i1; t[] = i2; t[] = i3;
t[] = i4; t[] = i5; t[] = i6;
t[] = i7; t[] = i8; t[] = i9;
}
} }
for (int i = ; i <= ; i++) {
if (t[i] && i!=) {
for (int j = ; j < t[i]; j++)
cout << i << " ";
}
else if (t[i] && i == ) {
for (int j = ; j < t[i]-; j++)
cout << i << " ";
cout << i;
}
} return ;
}
												

[poj]开关类问题 枚举 位运算的更多相关文章

  1. POJ 2436 二进制枚举+位运算

    题意:给出n头牛的得病的种类情况,一共有m种病,要求找出最多有K种病的牛的数目: 思路:二进制枚举(得病处为1,否则为0,比如得了2 1两种病,代号就是011(十进制就是3)),首先枚举出1的个数等于 ...

  2. 深入V8引擎-枚举+位运算实现参数配置

    不知不觉都快月底了,看了看上一篇还是6号写的,惭愧惭愧,说好的坚持.为了证明没有偷懒(其实还是沉迷了一会dota2),先上一个图自证清白. 基本上从初始化引擎,到Isolate.handleScope ...

  3. c#枚举位运算操作

    抛出预设问题 需要有一个npc需要在一周中的,周一,周二,周三会出现,其他时间不可见 解决问题 因为一周时间是固定的,所以创建枚举类型比较合适,如下 enum Days { None, Sunday, ...

  4. POJ 1166 The Clocks [BFS] [位运算]

    1.题意:有一组3*3的只有时针的挂钟阵列,每个时钟只有0,3,6,9三种状态:对时针阵列有9种操作,每种操作只对特点的几个时钟拨一次针,即将时针顺时针波动90度,现在试求从初试状态到阵列全部指向0的 ...

  5. poj 1222 EXTENDED LIGHTS OUT(位运算+枚举)

    http://poj.org/problem?id=1222 题意:给一个确定的5*6放入矩阵.每一个格子都有一个开关和一盏灯,0表示灯没亮,1表示灯亮着.让你输出一个5*6的矩阵ans[i][j], ...

  6. AcWing95. 费解的开关 枚举+位运算

    这道题的确比较难想,首先我们知道图比较小,有可能是枚举,那么该如何枚举呢??? 你可以发现,我们只要把第一排定了,并且保证第一排不准动,那么答案就定了 也就是说,我们首先用二进制枚举,枚举第一行需要翻 ...

  7. [POJ] 2453 An Easy Problem [位运算]

    An Easy Problem   Description As we known, data stored in the computers is in binary form. The probl ...

  8. BZOJ 1647 [Usaco2007 Open]Fliptile 翻格子游戏:部分枚举 位运算

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1647 题意: 在一个n*m(1 <= n,m <= 15)的棋盘上,每一个格子 ...

  9. POJ 1753 bfs+位运算

    T_T ++运算符和+1不一样.(i+1)%4 忘带小括号了.bfs函数是bool 型,忘记返回false时的情况了.噢....debug快哭了...... DESCRIPTION:求最少的步骤.使得 ...

随机推荐

  1. 《ASP.NET4从入门到精通》学习笔记2

    版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/dongdongdongJL/article/details/37610807   <ASP.N ...

  2. ABAP 性能优化001

    红方框里那一步之行很慢,lt_iflos这个内表才200多条数据 1.关键是你from那个表有多少数据.... 注意点: 1.不要用 CORRESPONDING FIELDS OF 2.LT_IFLO ...

  3. ZOJ - 3861 Valid Pattern Lock 【全排列】

    题目链接 http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3861 思路 先生成全排列,然后判断哪些情况不符合的,剔除就好了 ...

  4. poj 2336 Ferry Loading II ( 【贪心】 )

    Ferry Loading II Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 3704   Accepted: 1884 ...

  5. Codeforces Round #461 (Div. 2) B C D

    题目链接:http://codeforces.com/contest/922 B. Magic Forest time limit per test 1 second memory limit per ...

  6. LightOJ - 1151 Snakes and Ladders —— 期望、高斯消元法

    题目链接:https://vjudge.net/problem/LightOJ-1151 1151 - Snakes and Ladders    PDF (English) Statistics F ...

  7. Protothread 机制

    一.概述 很多传感器操作系统都是基于事件驱动模型的,事件驱动模型不用为每个进程都分配一个进程栈,这对内存资源受限的无线传感器网络嵌入式系统尤为重要. 然而事件驱动模型不支持阻塞等待抽象语句,因此程序员 ...

  8. ZOJ 3805 Machine(二叉树,递归)

    题意:一颗二叉树,求  “  宽度  ” 思路:递归,貌似这个思路是对的,先记下,但是提交时超时, 1.如果当前节点只有左孩子,那么当前宽度等于左孩子宽度 2.如果当前节点只有右孩子,那么当前宽度等于 ...

  9. blog集合

    godiscoder的技术blog 一个不错的技术架构设计blog MySQLOPS 数据库与运维自动化技术分享 stone的技术blog 陈皓专栏 风雪涟漪的技术blog 华为首席科学家 张宴技术b ...

  10. Custom Database Integration Guide

    Introduction This document provides instructions for integrating Openfire authentication, users, and ...