题目链接:
题目描述:
2x3=6 个方格中放入 ABCDE 五个字母,右下角的那个格空着。如下图所示。
编辑
和空格子相邻的格子中的字母可以移动到空格中,比如,图中的 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
输出
1 1 0
运行限制
- 最大运行时间: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); } } }