首页 > 试题广场 >

七星不靠-研发

[编程题]七星不靠-研发
  • 热度指数:1154 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 64M,其他语言128M
  • 算法知识视频讲解

七星不靠是中国麻将竞赛规则番种,胡牌时由东南西北中发白7张,外加其他花色的147、258、369不相连的牌型,且没有将牌而组成。

--百度百科



七星不靠中的七星是指:东西南北中发白,也就是牌中必须有这七张。而其它牌按下述的来拼全:

东西南北中发白+147万+258饼+369条

东西南北中发白+147万+258条+369饼

东西南北中发白+147条+258万+369饼

东西南北中发白+147条+258饼+369万

东西南北中发白+147饼+258条+369万

东西南北中发白+147饼+258万+369条

由于胡牌时只需要14张牌,而上述组合均有16张,那么除了东西南北中发白必须有外,其它三色可以随便去掉两张,都可以组成七星不靠。


我们的任务是,假设我们的14张牌中已经包含了东西南北中发白这7张牌,另外的牌都是万饼条的序数牌,给出另外的这7张牌,判断是否能组成七星不靠。

数据范围: 数据组数
进阶:每组数据的空间复杂度 ,时间复杂度

输入描述:

输入第一行为一个正整数T(T<=1000),表示有T组数据。

每组数据一行,包含7张牌,每张牌用”XY”表示,X为[1...9]的数字,Y为(“W”,”B”,”T”)中的一个,分别表示万,饼,条。有可能出现同样的"XY"但是数量不会超过4个。

保证数据一定合法。



输出描述:

对于每一组数据,输出YES或者NO,分别表示可以或者不可以组成七星不靠。

示例1

输入

4
1T 4T 7T 2B 5B 8B 9W
1T 2T 3T 4T 5T 6T 7T
1B 2W 3T 4B 5W 6T 8W
2B 8B 5B 2B 6T 7W 4W

输出

YES
NO
YES
NO
1、看了一圈好像很多人都没有做全,只是过了题目测试用例,其中相同花色 假如不是137,258,369这样的排列是不正确的,
2、这里有一个简单的方法判断他们是不是这样的组合,就是和3取余。
import java.util.*;

public class Main{
 public static void main(String []args){
        Scanner s=new Scanner(System.in);
        int len=s.nextInt();
        s.nextLine();

        String inNumber;
        Map<Character, ArrayList<Integer>> map=new HashMap<>();
        int i=0;
      
        while(i<len){
              String uu=s.nextLine();
            boolean chufuFlag=false;
            String[]hang=uu.split(" ");
            for(int j=0;j<hang.length;j++){
                inNumber=hang[j];
                if(inNumber.length()!=2){
                    chufuFlag=true;
                }
                if(!chufuFlag){
                    if(!map.containsKey(inNumber.charAt(1))){
                        map.put(inNumber.charAt(1),new ArrayList<>());
                    }
                    if(map.get(inNumber.charAt(1)).contains(Integer.parseInt(String.valueOf(inNumber.charAt(0))))){
                        chufuFlag=true;
                    }
                    map.get(inNumber.charAt(1)).add(Integer.parseInt(String.valueOf(inNumber.charAt(0))));
                }
            }
            i++;
            if(!chufuFlag){
                assertTrue(map);
            }else{
                System.out.println("NO");
            }
            map.clear();
        }
    }

    private static void assertTrue(Map<Character,ArrayList<Integer>> map){
        if(map.size()>3) {
            System.out.println("NO");
            return;
        }
        for(Map.Entry<Character,ArrayList<Integer>>entry:map.entrySet()){
            int count=0,flag=0;
            boolean flagRe=false;
            for(Integer num:entry.getValue()){
                if(count==0){
                    flag=num%3;
                }else{
                    if((num%3)!=flag){
                        System.out.println("NO");
                        return;
                    }
                }
                count++;
            }

        }
        System.out.println("YES");
    }



编辑于 2021-08-12 13:44:06 回复(0)