• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
不会投篮的邢
投篮三不沾
博客园    首页    新随笔    联系   管理    订阅  订阅

牛客-玛雅人的密码

题目描述

玛雅人有一种密码,如果字符串中出现连续的2012四个数字就能解开密码。给一个长度为N的字符串,(2=<N<=13)该字符串中只含有0,1,2三种数字,问这个字符串要移位几次才能解开密码,每次只能移动相邻的两个数字。例如02120经过一次移位,可以得到20120,01220,02210,02102,其中20120符合要求,因此输出为1.如果无论移位多少次都解不开密码,输出-1。

输入描述:

输入包含多组测试数据,每组测试数据由两行组成。
第一行为一个整数N,代表字符串的长度(2<=N<=13)。
第二行为一个仅由0、1、2组成的,长度为N的字符串。

输出描述:

对于每组测试数据,若可以解出密码,输出最少的移位次数;否则输出-1。
示例1

输入

复制
5
02120

输出

复制
1
import java.util.Scanner;
import java.util.List;
import java.util.LinkedList;
import java.util.Map;
import java.util.HashMap;
public class Main{
    public static List<String> Q = new LinkedList<String>();
    public static Map<String, Integer> M = new HashMap<String, Integer>();
    public static void main(String args[]){
        Scanner in = new Scanner(System.in);
        while(in.hasNextInt()){
            int n = in.nextInt();
            String s = in.next();
            if(s.contains("2012"))
                System.out.println("0"); 
            else{
                System.out.println(BFS(s));
            }
        }
    }
    //交换字符串的第i位和第i+1位
    public static String Swap(String s, int i){
        StringBuilder sb = new StringBuilder(s);
        char left = s.charAt(i);
        char right = s.charAt(i+1);
        sb.setCharAt(i, right);
        sb.setCharAt(i+1, left);
        return sb.toString();        
    }
    public static int BFS(String str){
        String newStr;
        M.clear();
        Q.clear();
        Q.add(str);
        M.put(str, 0);
        while(Q.size()>0){
            str = Q.get(0); 
            Q.remove(0);
            for(int i=0;i<str.length()-1;i++){
                newStr = Swap(str, i);
                if(!M.containsKey(newStr)){
                    M.put(newStr, M.get(str)+1);
                    if(newStr.contains("2012")){
                        return M.get(newStr);
                    }else{
                        Q.add(newStr);
                    }
                }
            }
        }
        return -1;
        
    }
}

本题相当于一个广度搜索BFS

例如输入02120                           20120

               01220

经过一次移位之后有02120         02210

               02102

移动一次之后的字符串位于第一层,使用一个Map存储该字符串所在的层号。

posted @ 2021-03-09 11:46  不会投篮的邢  阅读(87)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3