题目描述
2x3=6个方格中放入ABCDE五个字母,右下角的那个格空着。如下图所示。
A B C
D E
和空格子相邻的格子中的字母可以移动到空格中,比如,图中的C和E就可以移动,移动后的局面分别是:
A B
D E C
和
A B C
D E
为了表示方便,我们把6个格子中字母配置用一个串表示出来,比如上边的两种局面分别表示为:
ABDEC
ABCDE
题目的要求是:请编写程序,由用户输入若干表示局面的串,程序通过计算,输出是否能通过对初始状态经过若干次移动到达该状态。可以实现输出1,否则输出0。初始状态为:ABCDE*输入
n行状态。
输出
n行1或0
样例输入
ABCDE*
ABDEC
CAEDB样例输出
1
1
0
思路
将每一次移动后的矩阵以字符串的形式存入队列中,移动空格写成更改字符串的字符,最后还是广搜
代码
import java.util.HashSet;
import java.util.LinkedList;
import java.util.Queue;
import java.util.Scanner;
import javax.sound.midi.Soundbank;
public class Main {
static String fmap="1";
static HashSet<String> visit = new HashSet<String>();
static int[] move = {1,-1,3,-3};
public static void main(String[] args) {
String map = "ABCDE*";
Scanner in = new Scanner(System.in);
while(true) {
visit.clear();
fmap=in.nextLine();
if (fmap == null || fmap.trim().length() == 0) {
break;
}
BFS(map);
}
}
public static void BFS(String map) {
Queue<String> queue = new LinkedList<String>();
queue.offer(map);
visit.add(map);
int k;
while(!queue.isEmpty()) {
String next = queue.poll();
if(next.equals(fmap)) {
System.out.println(1);
return;
}
for(int i=0;i<6;i++) {
if(next.charAt(i)=='*') {
String s;
for(int j=0;j<4;j++) {
k=i+move[j];
if(k>=0 && k<6) {
s=swap(next,i,k);
if(!visit.contains(s)) {
visit.add(s);
queue.offer(s);
}
}
}
}
}
}
System.out.println(0);
}
public static String swap(String s,int i,int j) {
if(i>j) {
int a=i;
i=j;
j=a;
}
String ans = s.substring(0,i) + s.charAt(j) + s.substring(i+1,j) + s.charAt(i) + s.substring(j+1);
return ans;
}
}
class Node{
String map;
Node(String map){
this.map=map;
}
}