U - Tokitsukaze and Mahjong(模拟题(逻辑思维))

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
这道题,题意很简单,就是要让3个串形成满足有一个koutsu或者shuntsu,所需要添加的串的最少个数;根据条件可以知道,要满足至少有一个,那么就需要:
1.这三个字符串完全相同;
2.这三个字符串的suit(也就是后面的字母)必须相同,并且三个成连续的数字;
那么要我就可以讨论了;
1.如果三个相同或者suit相同时数字连续就直接不需要添加就够了(cout<<0);
2.如果有两个串完全相同就只需要添加一个;
3.如果如果三个的suit相同,那么就判断是不是有1,3,4或者1,3,5这些隔开,只需要添加一个就保证连续的情况;
4.如果有两个的suit相同,判断是不是1,3这种和,1,2这种,只需要添加一个‘
5.其他的就是三个串完全不同(指的每个串的suit都不同),那么就需要添加2个了;
所以情况就这么多,直接模拟即可(这里还考差了字符串读入的问题其实用一个stringstream getline就OK了):
AC代码:

#include<iostream>
#include<string>
#include<sstream>
#include<algorithm>
using namespace std;
string s[4];
bool cmp(string s,string s2){
  return s[0]<s2[0];
  }
int main(){
  string st;
  getline(cin,st);
  stringstream ss(st);
  for(int i=0;ss>>s[i];i++);
  if(s[0]==s[1]&&s[1]==s[2])return cout<<0<<endl,0;//如果三个完全相同
  if(s[0]==s[1]||s[0]==s[2]||s[1]==s[2])return cout<<1<<endl,0;//如果有两个完全相同
  if(s[0][1]==s[1][1]&&s[1][1]==s[2][1]){//如果有三个个suit相同
        sort(s,s+3,cmp);//排序
        if((s[1][0]==s[0][0]+1&&s[1][0]==s[2][0]-1))   {//判断是不是有连续的1,2,3这种挨着的
          return cout<<0<<endl,0;
          }else if(s[1][0]==s[0][0]+1||s[1][0]==s[0][0]+2||s[2][0]==s[1][0]+1||s[2][0]==s[1][0]+2){//判断是不是有两个是连续的
               return  cout<<1<<endl,0;
            }else return cout<<2<<endl,0;//如果没有连续的就是2了
    }
    if(s[0][1]==s[1][1]){//判断两个suit相同的
        if(s[1][0]==s[0][0]+1||s[1][0]==s[0][0]+2||s[1][0]==s[0][0]-1||s[1][0]==s[0][0]-2)
        {
          return cout<<1<<endl,0;
        }else return cout<<2<<endl,0;
      }else if(s[0][1]==s[2][1]){
        if(s[0][0]==s[2][0]+1||s[0][0]==s[2][0]+2||s[0][0]==s[2][0]-1||s[0][0]==s[2][0]-2)
        {
          return cout<<1<<endl,0;
        }else return cout<<2<<endl,0;
        }else if(s[1][1]==s[2][1]){
           if(s[1][0]==s[2][0]+1||s[1][0]==s[2][0]+2||s[1][0]==s[2][0]-1||s[1][0]==s[2][0]-2)
        {
          return cout<<1<<endl,0;
        }else return cout<<2<<endl,0;
          }
          cout<<2<<endl;//最后三个完全不同的
  return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值