移动字母(蓝桥杯—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


    相关文章
    |
    2月前
    |
    算法 前端开发 数据处理
    小白学python-深入解析一位字符判定算法
    小白学python-深入解析一位字符判定算法
    53 0
    |
    7月前
    |
    C语言
    c语言编程练习题:7-30 念数字
    c语言编程练习题:7-30 念数字
    157 0
    |
    6月前
    |
    机器学习/深度学习 资源调度
    技术经验解读:【常用】数学符号及读法大全
    技术经验解读:【常用】数学符号及读法大全
    76 0
    |
    7月前
    |
    C语言
    C语言 浙大版《C语言程序设计(第3版)》题目集 练习8-8 移动字母 (10分)
    C语言 浙大版《C语言程序设计(第3版)》题目集 练习8-8 移动字母 (10分)
    |
    7月前
    |
    Java Go C++
    Rust每日一练(Leetday0017) 字母异位词分组、幂函数、N皇后
    Rust每日一练(Leetday0017) 字母异位词分组、幂函数、N皇后
    52 1
    Rust每日一练(Leetday0017) 字母异位词分组、幂函数、N皇后
    |
    7月前
    |
    Java C语言 C++
    第十四届蓝桥杯集训——练习解题阶段(无序阶段)-试题 基础练习 十六进制转八进制
    第十四届蓝桥杯集训——练习解题阶段(无序阶段)-试题 基础练习 十六进制转八进制
    42 0
    |
    7月前
    |
    Java C语言 C++
    第十四届蓝桥杯集训——练习解题阶段(无序阶段)-基础练习 十六进制转十进制
    第十四届蓝桥杯集训——练习解题阶段(无序阶段)-基础练习 十六进制转十进制
    59 0
    |
    人工智能 C++
    蓝桥杯练习题十三 - 猜字母(c++)
    蓝桥杯练习题十三 - 猜字母(c++)
    156 0
    |
    算法
    重温算法之有效的字母异位词
    题友的哈希映射法,不需要额外的空间,相比较我这个,使用了现成方法的,其实优秀很多,当然如果在实际的业务开发中,需要用到算法时,包装过的方法有时候是比较有优势的。
    120 0
    重温算法之有效的字母异位词
    不同子串[蓝桥杯2019初赛]
    一个字符串的非空子串是指字符串中长度至少为1 的连续的一段字符组成的串。 例如,字符串aaab 有非空子串a, b, aa, ab, aaa, aab, aaab,一共7 个。 注意在计算时,只算本质不同的串的个数。 请问,字符串0100110001010001 有多少个不同的非空子串?