题目描述
计科老班在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();
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
);
temp
.step
=current
.step
+1;
if(temp
.S
.indexOf("0")<0)
{
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
;
}
}