移动字母(蓝桥杯—12年困难题)

简介: 移动字母(蓝桥杯—12年困难题)

 题目链接:

题目描述:

2x3=6 个方格中放入 ABCDE 五个字母,右下角的那个格空着。如下图所示。

image.gif编辑

和空格子相邻的格子中的字母可以移动到空格中,比如,图中的 C 和 E 就可以移动,移动后的局面分别是:

A B

D E C

A B C

D E

为了表示方便,我们把 6 个格子中字母配置用一个串表示出来,比如上边的两种局面分别表示为:

AB*DEC

ABCD*E

题目的要求是:请编写程序,由用户输入若干表示局面的串,程序通过计算,输出是否能通过对初始状态经过若干次移动到达该状态。可以实现输出 1,否则输出 0。初始状态为:ABCDE*。

输入描述

先是一个整数 nn,表示接下来有 nn 行状态。

输出描述

程序输出 nn 行 1 或 0。

输入输出样例

示例

输入

3
ABCDE*
AB*DEC
CAED*B

image.gif

输出

1
1
0

image.gif

运行限制

    • 最大运行时间:1s
    • 最大运行内存: 256M
    import java.util.HashSet;
    import java.util.LinkedList;
    import java.util.Scanner;
    public class 移动字母 {
        public static void main(String[] args) {
            // TODO Auto-generated method stub
            Scanner sc = new Scanner(System.in);
            LinkedList<String> list = new LinkedList<String>();
            HashSet<String> set = new HashSet<String>();
            list.add("ABCDE*");
            set.add("ABCDE*");
            int dir[] = {-3,-1,1,3};
            while(!list.isEmpty()) {
                int size = list.size();
                for (int i = 0; i <size ; i++) {
                    String p = list.poll();
                    int index = p.indexOf('*');
                    for (int j = 0; j < 4; j++) {
                        int newindex = index+dir[j];
                        if(newindex<0||newindex>p.length()-1)
                            continue;
                        if(index%3==newindex%3||index/3==newindex/3) {
                            char[] tempchar = p.toCharArray();
                            tempchar[index] = p.charAt(newindex);
                            tempchar[newindex] = p.charAt(index);
                            String news = new String(tempchar);
                            if(!set.contains(news)) {
                                set.add(news);
                                list.add(news);
                            }
                        }
                    }
                }
            }
            //System.out.println(set);
            int n = sc.nextInt();
            for(int i=0;i<n;i++) {
                String s = sc.next();
                if(set.contains(s))
                    System.out.println(1);
                else
                    System.out.println(0);
            }
        }
    }

    image.gif


    相关文章
    |
    1月前
    |
    算法 前端开发 数据处理
    小白学python-深入解析一位字符判定算法
    小白学python-深入解析一位字符判定算法
    47 0
    |
    6月前
    |
    C语言
    c语言编程练习题:7-30 念数字
    c语言编程练习题:7-30 念数字
    145 0
    |
    5月前
    |
    存储
    力扣经典150题第四十一题:有效的字母异位词
    力扣经典150题第四十一题:有效的字母异位词
    25 0
    |
    6月前
    |
    Java C语言 C++
    第十四届蓝桥杯集训——练习解题阶段(无序阶段)-试题 基础练习 十六进制转八进制
    第十四届蓝桥杯集训——练习解题阶段(无序阶段)-试题 基础练习 十六进制转八进制
    38 0
    |
    算法 Python
    【完虐算法】「字符串-最长公共前缀」5种方法脑洞大开
    最近在专题制作过程中遇到了**最长前缀公共子串**的问题,也是读者最近校招面试到的一个题目。为什么拿出这个来说呢? 可怕的是,他居然给了 5 种解题方法。 更可怕的是,因此他直接少了一轮面试,天哪!!
    392 0
    |
    算法 C++ Python
    【每日算法Day 86】面试经典题:把数字翻译成字符串
    【每日算法Day 86】面试经典题:把数字翻译成字符串
    |
    人工智能 C++
    蓝桥杯练习题十三 - 猜字母(c++)
    蓝桥杯练习题十三 - 猜字母(c++)
    152 0
    |
    算法 Go
    算法练习第七天——有效的字母异位词
    给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。 注意:若 s 和 t 中每个字符出现的次数都相同,则称 s 和 t 互为字母异位词。
    |
    算法
    重温算法之有效的字母异位词
    题友的哈希映射法,不需要额外的空间,相比较我这个,使用了现成方法的,其实优秀很多,当然如果在实际的业务开发中,需要用到算法时,包装过的方法有时候是比较有优势的。
    115 0
    重温算法之有效的字母异位词