举例,
下面的方阵无解
T M T M O
X R U C q
A B C X R
U R M T O
T Q C R A
下面的方阵交换(0, 2)和(1, 2)两个糖果后,能消除M
T M T M O
X R M C q
A B C X R
U R M T O
T Q C R A
如果有解,则输出YES,同时输出所有交换方案中,被交换糖果最小编号(1到25),比如:上面的方阵中,被交换的糖果,编号最小的为糖果“T”,编号为3。
如果无解,则输出NO。
运行时间限制: 无限制
内存限制: 无限制
输入: 输入25个字符组成的字符串,不含空格,表示5×5的方阵
输出: 如果有解,则输出YES,同时输出所有交换方案中,被交换糖果最小编号,以空格隔开。如果无解,则输出NO。
样例输入: TMTMOXRMCqABCXRURMTOTQCRA
样例输出: YES 3
答案提示: 输出最小糖果编号的意思,就是从左至右,从上到下遍历糖果,找到第一个跟其他交换后能消除的糖果即可。
我的比较简单的想法是:创建一个9*9的矩阵,来解除边界问题。然后依次遍历。
import java.util.Scanner;
public class 天天爱消除 {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner cin = new Scanner(System.in);
String line;
char[][] cs = new char[9][9];
while(cin.hasNext()){
line = cin.nextLine();
int c = 0;
for(int i=2;i<7;i++){
for(int j=2;j<7;j++){
cs[i][j] = line.charAt(c++);
}
}
for(int i=2;i<7;i++){
for(int j=2;j<7;j++){
if(i!=6&&j!=6){
rightSwap(cs,i,j);//右换
if(isXiao(cs,i,j)||isXiao(cs,i,j+1)){
System.out.println("Yes"+" "+((j-2)+1+(i-2)*5));
return;
}
rightSwap(cs,i,j);//换回
downSwap(cs,i,j);//下换
if(isXiao(cs,i,j)||isXiao(cs,i+1,j)){
System.out.println("Yes"+" "+((j-2)+1+(i-2)*5));
return;
}
downSwap(cs,i,j);//换回
}
else if(j==6&&i==6){
System.out.println("No");
return;
}else if(j==6){
downSwap(cs,i,j);//下换
if(isXiao(cs,i,j)||isXiao(cs,i+1,j)){
System.out.println("Yes"+" "+((j-2)+1+(i-2)*5));
return;
}
downSwap(cs,i,j);//换回
}else if(i==6){
rightSwap(cs,i,j);//右换
if(isXiao(cs,i,j)||isXiao(cs,i,j+1)){
System.out.println("Yes"+" "+((j-2)+1+(i-2)*5));
return;
}
rightSwap(cs,i,j);//换回
}
}
}
}
}
private static void downSwap(char[][] cs, int i, int j) {
// TODO Auto-generated method stub
char tmp;
tmp = cs[i][j];
cs[i][j] = cs[i+1][j];
cs[i+1][j] = tmp;
}
private static boolean isXiao(char[][] cs, int i, int j) {
// TODO Auto-generated method stub
if((cs[i][j]==cs[i][j-1]&&cs[i][j]==cs[i][j-2])||
(cs[i][j]==cs[i][j-1]&&cs[i][j]==cs[i][j+1])||
(cs[i][j]==cs[i][j+1]&&cs[i][j]==cs[i][j+2]))
return true;
if((cs[i][j]==cs[i-1][j]&&cs[i][j]==cs[i-2][j])||
(cs[i][j]==cs[i-1][j]&&cs[i][j]==cs[i+1][j])||
(cs[i][j]==cs[i+1][j]&&cs[i][j]==cs[i+2][j]))
return true;
return false;
}
private static void rightSwap(char[][] cs, int i, int j) {
// TODO Auto-generated method stub
char tmp;
tmp = cs[i][j];
cs[i][j] = cs[i][j+1];
cs[i][j+1] = tmp;
}
}