翻硬币

    xiaoxiao2023-12-01  155

    题目描述

    计科老班在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; } }
    最新回复(0)