题目描述
计科老班在IT技能节摆摊玩游戏。桌面放有一排n枚硬币,有正面有反面。规定一次操作只能翻动连续3枚硬币。问最少需要几次操作才能把所有硬币变成正面。
输入
输入数据有多行,每行一个由0和1组成字符串,长度不超过15个字符,0表示反面,1表示正面。字符串为一个0时表示输入结束
输出
输出需要的最小操作数(每个一行),如果不可能完成,输出"No answer"
样例输入
1001111001
1001011001
100101100101
0100101
0
样例输出
4
No answer
6
4
代码实现
import java.util.ArrayList;
import java.util.Scanner;
public class Coins {
ArrayList<Node> Que;
ArrayList<String> result=new ArrayList<String>();
int head;
int n;
public Coins() {
Scanner sc=new Scanner(System.in);
for(int m=0;m<4;m++){
Que=new ArrayList<Node>();
Node startnode=new Node();
startnode.S=sc.nextLine();//获取键盘输入
startnode.step=0;
Que.add(startnode);
head=0; n=startnode.S.length();
//BFS here
while(head<Que.size()){
Node current=Que.get(head);
head++;
for(int i=0;i<n-2;i++)
{
Node temp=new Node();
char[] A=current.S.toCharArray();//将字符串转换为字符数组
A[i]=(A[i]=='0') ? '1':'0';
A[i+1]=(A[i+1]=='0') ? '1':'0';
A[i+2]=(A[i+2]=='0') ? '1':'0';
temp.S=String.valueOf(A);//将数组A转换成字符串
temp.step=current.step+1;
//判断是否目标
if(temp.S.indexOf("0")<0)//indexOf找不到0返回-1
{
result.add(String.valueOf(temp.step));
head=Que.size()+1; break;
}
//判断重复
boolean sign=true;
for(int k=0;k<Que.size() && sign;k++)
if(temp.S.equals(Que.get(k).S)) sign=false;
if(sign==true)//新状态
Que.add(temp);
}
if(head==Que.size())
result.add("No answer");
}
}
if(sc.nextLine().equals("0")){
for(String a:result){
System.out.println(a);
}
}
}
public static void main(String[] args) {
Coins C=new Coins();
}
class Node{
String S;
int step;
}
}