【华为上机】天天爱消除

CandyBrush一款流行的消除游戏,在一个方阵中布满各种糖果,任意交换两个糖果,如果交换后出现横向或者竖向有连续三个相同的情况,则可以消除糖果并得分。    
输入25个字符组成的字符串(编号为1到25),表示5×5的方阵,每个字符表示不同类型的糖果(区分大小写),判断是否有解,即交换某两个糖果后能够消除糖果。

    举例,    
    下面的方阵无解    
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;
		
	}


}


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值