翻纸牌游戏

Time Limit: 9000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)

Problem Description
有一种纸牌游戏,很有意思,给你N张纸牌,一字排开,纸牌有正反两面,开始的纸牌可能是一种乱的状态(有些朝正,有些朝反),现在你需要整理这些纸牌。但是麻烦的是,每当你翻一张纸牌(由正翻到反,或者有反翻到正)时,他左右两张纸牌(最左边和最右边的纸牌,只会影响附近一张)也必须跟着翻动,现在给你一个乱的状态,问你能否把他们整理好,使得每张纸牌都正面朝上,如果可以,最少需要多少次操作。
 
Input
有多个case,每个case输入一行01符号串(长度不超过20),1表示反面朝上,0表示正面朝上。
 
Output
对于每组case,如果可以翻,输出最少需要翻动的次数,否则输出NO。
 
Sample Input
01
011
 
Sample Output
NO
1
 

0^1 = 1

1^1 = 0

[][][][][][][]

^   1100000

^   0111000

^   0011100

^   0001110

^   0000111

^   0000011

#include <iostream>
#include <string>
#include <string.h>
#include <map>
#include <stdio.h>
#include <algorithm>
#include <queue>
#include <vector>
#include <math.h>
#include <set>
#define Max(a,b) ((a)>(b)?(a):(b))
#define Min(a,b) ((a)<(b)?(a):(b))
using namespace std ;
typedef long long LL ;
bool visited[<<] ;
class App{
private :
string st ;
int st_num ;
int Len ;
struct Node{
int X ;
int step ;
friend bool operator < (const Node A ,const Node B){
return A.step > B.step ;
}
Node(){}
Node(int x ,int s):X(x),step(s){}
};
public :
App() ;
App(string ) ;
int bfs() ;
}; App::App(){ } App::App(string s):st(s){
memset(visited,,sizeof(visited)) ;
st_num = ;
Len = st.length() ;
for(int i = ; i < Len ; i++)
st_num = (st_num<<) + (st[i]-'') ;
visited[st_num] = ;
} int App::bfs(){
priority_queue<Node> que ;
que.push(Node(st_num,)) ;
while(!que.empty()){
Node now = que.top() ;
int x = now.X ,nx ;
int s = now.step ;
if(x == )
return s ;
que.pop() ;
nx = x^ ;
if(!visited[nx]){
visited[nx] = ;
que.push(Node(nx,s+)) ;
}
for(int i = ; i <= Len - ; i++){
nx = (<<i)^x ;
if(!visited[nx]){
visited[nx] = ;
que.push(Node(nx,s+)) ;
}
}
nx = (<<(Len-))^x ;
if(!visited[nx]){
visited[nx] = ;
que.push(Node(nx,s+)) ;
}
}
return - ;
} int main(){
string s ;
while(cin>>s){
App app(s) ;
int step = app.bfs() ;
if(step == -)
puts("NO") ;
else
printf("%d\n",step) ;
}
return ;
}

HDU 2209 翻纸牌游戏 状态BFS的更多相关文章

  1. HDU 2209 翻纸牌游戏

    翻纸牌游戏 Time Limit : 9000/3000ms (Java/Other)   Memory Limit : 32768/32768K (Java/Other) Total Submiss ...

  2. HDU 2209 翻纸牌游戏(DFS)

    题目链接 Problem Description 有一种纸牌游戏,很有意思,给你N张纸牌,一字排开,纸牌有正反两面,开始的纸牌可能是一种乱的状态(有些朝正,有些朝反),现在你需要整理这些纸牌.但是麻烦 ...

  3. hdu 2209 翻纸牌游戏【贪心】

    本来是冲着搜索去的--其实可以贪心 因为能改变第一位的只有第一位和第二位,然后改完之后后面的同理,也就是说只要贪心的推一遍就可以 但是注意要在翻第一个和不翻第一个之间取个min #include< ...

  4. 【HDOJ】2209 翻纸牌游戏

    状态压缩+双向广搜.注意控制时间t. /* 2209 */ #include <iostream> #include <string> #include <map> ...

  5. hdu2209翻纸牌游戏

    翻纸牌游戏 Time Limit: 9000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Subm ...

  6. 翻纸牌游戏(dfs回溯)

    翻纸牌游戏 Time Limit : 9000/3000ms (Java/Other)   Memory Limit : 32768/32768K (Java/Other) Total Submiss ...

  7. [Usaco2007 Open]Fliptile 翻格子游戏 状态压缩

    考试想到了状压,苦于T1废掉太长时间,于是默默输出impossible.. 我们知道,一个格子的翻转受其翻转次数和它相邻翻转次数的影响. 由每一个位置操作两次相当于把它翻过来又翻回去,所以答案中每一个 ...

  8. HDU 3537 Mock Turtles型翻硬币游戏

    题目大意: 每次可以翻1个或者2个或者3个硬币,但要保证最右边的那个硬币是正面的,直到不能操作为输,这题目还有说因为主人公感情混乱可能描述不清会有重复的硬币说出,所以要去重 这是一个Mock Turt ...

  9. 翻纸牌 高校俱乐部 英雄会 csdn

    题目描述 有一种纸牌游戏,很有意思,给你N张纸牌,一字排开,纸牌有正反两面,开始的纸牌可能是一种乱的状态(有些朝正,有些朝反),现在你需要整理这些纸牌.但是麻烦的是,每当你翻一张纸牌(由正翻到反,或者 ...

随机推荐

  1. HDP2.4安装(四):ambari安装

    ambari是apache基金会的开源项目,它的优势在于巧妙溶合已有的开源软件,提供集群自动化安装.中心化管理.集群监控.报警等功能.据Hortonwork官方资料介绍,不同的HDP版本,对ambar ...

  2. Servlet Listener

    需要继承ServletContextListener接口. 代码: package com.my; import java.io.*; import javax.servlet.*; import j ...

  3. 【phantomjs】使用phantomjs生成highChart的图片(待完善)

    阅读目录 //center }, subtitle: { text: 'Source: WorldClimate.com', x: -20 }, xAxis: { categories: ['Jan' ...

  4. IntelliJ IDEA手动配置连接MySQL数据库

    先从菜单View→Tool Windows→Database打开数据库工具窗口,如下图所示: 点击Database工具窗口左上角添加按钮"+",选择数据库类型,这里以MySQL为例 ...

  5. [svn] linux命令——svn分支创建、合并

    一.创建分支 1,创建一个分支 svn copy svn://xx.com/repo/trunk svn://xx.com/repo/branches/TRY-something -m 'make b ...

  6. 黄聪:wordpress源码解析-目录结构-文件调用关系(转)

    Wordpress是一个单入口的文件,所有的前端处理都必须经过index.php,这是通过修改web服务器的rewrite规则来实现的.这种做法的好处是显而易见的,这样URL更好看,不必为每一个url ...

  7. [实变函数]2.3 开集 (open set), 闭集 (closed set), 完备集 (complete set)

    1        $$\beex \bea E\mbox{ 是开集}&\lra E^o=E\\        &\lra \forall\ P_0\in E,\ \exists\ U( ...

  8. [实变函数]5.3 非负可测函数的 Lebesgue 积分

    本节中, 设 $f,g,f_i$ 是可测集 $E$ 上的非负可测函数, $A,B$ 是 $E$ 的可测子集.       1 定义: (1) $f$ 在 $E$ 上的 Lebesgue 积分      ...

  9. Map的3种遍历[轉]

    Map<String, String> map = new HashMap<String, String>(); map.put("A", "AA ...

  10. Coding.net 代码管理快速入门

    当项目创建好了之后,我们该如何上传代码到 coding 上呢? Coding 网站使用“ Git 仓库”(类似 github )来管理代码. 其操作原理在于:利用 git 服务,将本地的项目目录下的文 ...