翻纸牌游戏_hdu_2209(双向广搜).java(一)

2014-11-24 08:39:15 · 作者: · 浏览: 0
翻纸牌游戏
Time Limit: 9000/3000 MS ( Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 1885 Accepted Submission(s): 661
Problem Description
有一种纸牌游戏,很有意思,给你N张纸牌,一字排开,纸牌有正反两面,开始的纸牌可能是一种乱的状态(有些朝正,有些朝反),现在你需要整理这些纸牌。但是麻烦的是,每当你翻一张纸牌(由正翻到反,或者有反翻到正)时,他左右两张纸牌(最左边和最右边的纸牌,只会影响附近一张)也必须跟着翻动,现在给你一个乱的状态,问你能否把他们整理好,使得每张纸牌都正面朝上,如果可以,最少需要多少次操作。
Input
有多个case,每个case输入一行01符号串(长度不超过20),1表示反面朝上,0表示正面朝上。
Output
对于每组case,如果可以翻,输出最少需要翻动的次数,否则输出NO。
Sample Input
01
011
Sample Output
NO
1
Author
wangye
Recommend
wangye | We have carefully selected several similar problems for you: 2102 1495 1180 2201 2200
[java] view plaincopy
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.Queue;
public class Main {//超时
static String sf="";
static int len=0;
//static HashMap map;
static boolean ok=false;
public static void main(String[] args) {
BufferedReader bf=new BufferedReader(new InputStreamReader(System.in));
String s;
try {
while((s=bf.readLine())!=null){
ok=false;
StringBuffer ss=new StringBuffer(s);
len=ss.length();
sf="";
for(int i=0;i
sf+="0";
HashMap map=new HashMap();
map.put(s, 0);
P p=new P();
p.s=ss;
p.num=0;
Queue

q=new LinkedList

();

q.add(p);
bfs(q,map);
if(!ok)
System.out.println("No");
}
} catch (Exception e) {
e.printStackTrace();
}
}
private static void bfs(Queue

q,HashMap map) {

while(!q.isEmpty()){
boolean okk=false;
if(okk){
ok=true;
return;
}
P d=new P();
d=q.poll();
String k=d.s.toString();
if(k.equals(sf)){
System.out.println(d.num);
ok=true;
return;
}
StringBuffer g=d.s;
for(int i=0;i
StringBuffer f=new StringBuffer(g);
if(f.charAt(i)=='0'){
f.deleteCharAt(i);
f.insert(i, 1);
}
else{
f.deleteCharAt(i);
f.insert(i, 0);
}
if(i>0){
if(f.charAt(i-1)=='0'){
f.deleteCharAt(i-1);
f.insert(i-1, 1);
}
else{
f.deleteCharAt(i-1);
f.insert(i-1, 0);
}
}
if(i+1
if(f.charAt(i+1)=='0'){
f.deleteCharAt(i+1);
f.insert(i+1, 1);
}
else{
f.deleteCharAt(i+1);
f.insert(i+1, 0);
}
}
String f1=f.toString();
if(map.get(f1)==null){
// System.out.println("*****"+f);
// System.out.print