斗地主

首先题目规则就是斗地主的规则,只有大王和小王的规则与平时的斗地主有一点出入。就是暴搜,既然是暴搜代码就肯定是又臭又长(de)了三个小时的(bug)发现一个>写成了<,哭了啊。呜呜呜呜~~~。

#include<bits/stdc++.h>
using namespace std;
#define scy(x) freopen(x".in","r",stdin);freopen(x".out","w",stdout);
inline int read(){
  int x=0,f=1;
  char ch=getchar();
  while(ch<'0'||ch>'9'){
    if(ch=='-') f=-1;
    ch=getchar();
  }
  while(ch>='0'&&ch<='9'){
    x=(x<<1)+(x<<3)+(ch^48);
    ch=getchar();
  }
  return x*f;
}
int t,n,ans,sum[25];
void dfs (int x){
  if(x>=ans) return;
  //顺子
  int k=0;//顺子
  for(int i=3;i<=14;i++){
    if(sum[i]==0) k=0;
    else{
      k++;
      if(k>=5){
        for(int j=i;j>=i-k+1;j--) sum[j]--;
        dfs(x+1);
        for(int j=i;j>=i-k+1;j--) sum[j]++;
      }
    }
  }
  k=0;//连对
  for(int i=3;i<=14;i++){
    if(sum[i]<=1) k=0;
    else{
      k++;
if(k>=3){
  for(int j=i;j>=i-k+1;j--) sum[j]-=2;
  dfs(x+1);
  for(int j=i;j>=i-k+1;j--) sum[j]+=2;
}
}
    }
  k=0;//类似飞机
  for(int i=3;i<=14;i++){
    if(sum[i]<=2) k=0;
    else{
      k++;
if(k>=2){//飞机可以带牌
  for(int j=i;j>=i-k+1;j--) sum[j]-=3;
  dfs(x+1);
  for(int j=i;j>=i-k+1;j--) sum[j]+=3;
}
}
    }
for(int i=2;i<=14;i++){//枚举有三张或四张的
  if(sum[i]<=3){
    if(sum[i]<=2) continue;
    sum[i]-=3;
    for(int j=2;j<=15;j++){
      if(sum[j]<=0||j==i) continue;
      sum[j]--;
      dfs(x+1);
      sum[j]++;
    }
    for(int j=2;j<=14;j++){
      if(sum[j]<=1||j==i) continue;
      sum[j]-=2;
      dfs(x+1);
      sum[j]+=2;
    }
    sum[i]+=3;
  }
  else{
    sum[i]-=3;
    for(int j=2;j<=15;j++){
      if(sum[j]<=0||j==i) continue;
      sum[j]--;
      dfs(x+1);
      sum[j]++;
    }
    for(int j=2;j<=14;j++){
      if(sum[j]<=1||j==i) continue;
      sum[j]-=2;
      dfs(x+1);
      sum[j]+=2;
    }
    sum[i]+=3;

    sum[i]-=4;
    for(int j=2;j<=15;j++){
      if(sum[j]<=0||j==i) continue;
      sum[j]--;
      for(int k=2;k<=15;k++){
        if(sum[k]<=0||j==k) continue;
        sum[k]--;
        dfs(x+1);
        sum[k]++;
      }
sum[j]++;
    }
for(int j=2;j<=14;j++){
  if(sum[j]<=1||j==i) continue;
  sum[j]-=2;
  for(int k=2;k<=14;k++){
    if(sum[k]<=1||j==k) continue;
    sum[k]-=2;
    dfs(x+1);
    sum[k]+=2;
  }
  sum[j]+=2;
}
sum[i]+=4;
}
}
for(int i=2;i<=15;i++) if(sum[i]) x++;
ans=min(ans,x);
}
int main(){
  //scy("in");
   t=read(),n=read();
  while(t--){
    ans=0x7fffffff;
    int x,y;
    memset(sum,0,sizeof sum);
    for(int i=1;i<=n;i++){
     x=read(),y=read();
      if(x==0) sum[15]++;
      else if(x==1) sum[14]++;
      else sum[x]++;
    }
    dfs(0);
    printf("%d
",ans);
  }
}
原文地址:https://www.cnblogs.com/scy-fisheep/p/13816176.html