把对错两个程序都贴上来对比一下,快速定位bug的能力还是有些差:
错误程序(虽然考虑到了牌不超过5张,但是写的位置不对):
#include<iostream>
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<vector>
#include<algorithm>
#include<functional>
#include<queue>
using namespace std;
int ting[30]={0};
int pai[30]={0};
int paibak[30]={0};
bool Hu(int num,int flag){
int i,j,res;
if(num==0&&flag)
return true;
else{
i=0;
while(i<30){
if( pai[i]!=0 ){
/*********************就是这里相当于没写********************/
if( pai[i]>=5 ){
return false;
}
/*********************就是这里相当于没写********************/
if( pai[i]>=3 ){
pai[i]-=3;
res=Hu( num-3,flag );
pai[i]+=3;
if(res)
return true;
}
if( pai[i]>=2 && flag==0 ){
flag=1;
pai[i]-=2;
res=Hu( num-2,flag );
pai[i]+=2;
flag=0;
if(res)
return true;
}
if( pai[i]>=1&&i<28 &&pai[i+1]>=1 &&pai[i+2]>=1 ){
pai[i]--; pai[i+1]--; pai[i+2]--;
res=Hu( num-3,flag );
pai[i]++; pai[i+1]++; pai[i+2]++;
if(res)
return true;
}
}
i++;
}
if(i==30)
return false;
}
}
int main(){
int T,i,j,k,a,F,tt;
char c;
scanf("%d",&T);
for(i=0;i<T;i++){
memset(pai,0,sizeof(pai));
memset(paibak,0,sizeof(paibak));
memset(ting,0,sizeof(ting));
for(j=0;j<13;j++){
scanf("%d%c",&a,&c);
//s<t<w
if( c=='t' )
a+=10;
if( c=='w' )
a+=20;
pai[a]++;
paibak[a]++;
}
for(j=1;j<10;j++)
for(k=0;k<=20;k+=10){
if(j+k==25){
pai[j+k]=pai[j+k];
}
pai[j+k]++;
if( Hu( 14,0 ) ){
ting[ j+k ]=1;
for(tt=0;tt<30;tt++){
pai[tt]=paibak[tt];
}
}
else
pai[j+k]--;
}
F=0;
for(j=1;j<10;j++)
for(k=0;k<=20;k+=10){
if( ting[j+k] ){
if(F==0){
printf("Yes");
F=1;
}
printf(" %d",j);
if( k==10 )
printf("t");
else if( k==20 )
printf("w");
else
printf("s");
}
}
if(F==0)
printf("No");
printf("\n");
}
system("pause");
return 0;
}
错误的输入输出:
AC程序:
#include<iostream>
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<vector>
#include<algorithm>
#include<functional>
#include<queue>
using namespace std;
int ting[30]={0};
int pai[30]={0};
int paibak[30]={0};
bool Hu(int num,int flag){
int i,j,res;
if(num==0&&flag)
return true;
else{
for(i=0;i<30;i++)
if( pai[i]>=5 )
return false;
i=0;
while(i<30){
if( pai[i]!=0 ){
if( pai[i]>=3 ){
pai[i]-=3;
res=Hu( num-3,flag );
pai[i]+=3;
if(res)
return true;
}
if( pai[i]>=2 && flag==0 ){
flag=1;
pai[i]-=2;
res=Hu( num-2,flag );
pai[i]+=2;
flag=0;
if(res)
return true;
}
if( pai[i]>=1&&i<28 &&pai[i+1]>=1 &&pai[i+2]>=1 ){
pai[i]--; pai[i+1]--; pai[i+2]--;
res=Hu( num-3,flag );
pai[i]++; pai[i+1]++; pai[i+2]++;
if(res)
return true;
}
}
i++;
}
if(i==30)
return false;
}
}
int main(){
int T,i,j,k,a,F,tt;
char c;
scanf("%d",&T);
for(i=0;i<T;i++){
memset(pai,0,sizeof(pai));
memset(paibak,0,sizeof(paibak));
memset(ting,0,sizeof(ting));
for(j=0;j<13;j++){
scanf("%d%c",&a,&c);
//s<t<w
if( c=='t' )
a+=10;
if( c=='w' )
a+=20;
pai[a]++;
paibak[a]++;
}
for(j=1;j<10;j++)
for(k=0;k<=20;k+=10){
pai[j+k]++;
if( Hu( 14,0 ) ){
ting[ j+k ]=1;
for(tt=0;tt<30;tt++){
pai[tt]=paibak[tt];
}
}
else
pai[j+k]--;
}
F=0;
for(j=1;j<10;j++)
for(k=0;k<=20;k+=10){
if( ting[j+k] ){
if(F==0){
printf("Yes");
F=1;
}
printf(" %d",j);
if( k==10 )
printf("t");
else if( k==20 )
printf("w");
else
printf("s");
}
}
if(F==0)
printf("No");
printf("\n");
}
//system("pause");
return 0;
}
测试用例为:
20
1w 4w 7w 1s 2s 3s 4s 5s 7s 9s 1s 3s 8t
7w 7w 7w 7w 8w 9w 8w 9w 1s 1s 1s 2s 2s
1w 2w 3w 4w 5w 6w 7w 8w 9w 2s 3s 3s 4s
1w 4w 4w 4w 5w 5w 5w 7s 7s 7s 8s 8s 8s
1w 2w 3w 4w 5w 6w 7w 8w 9w 3t 3t 3t 8t
4w 4w 4w 5w 5w 5w 7s 7s 7s 8s 8s 1w 1w
1w 2w 3w 4w 5w 6w 7w 8w 9w 3t 4t 5t 6t
1w 2w 3w 4w 5w 6w 7w 8w 9w 3t 3t 3t 4t
1w 1w 1w 4s 4s 4s 2t 3t 4t 5t 6t 9t 9t
1t 1t 1t 1w 1w 1w 3w 4w 5w 6w 8w 8w 8w
1t 1t 1t 2w 2w 2w 3w 4w 4w 4w 5w 5w 6w
1t 1t 1t 1s 1s 1s 2w 2w 2w 3w 4w 4w 4w
1t 1t 1t 1w 1w 1w 2w 3w 3w 4w 5w 5w 5w
1t 1t 1t 2w 3w 4w 4w 5w 6w 7w 8w 8w 8w
1t 1t 1t 2w 2w 2w 3w 4w 5w 6w 6w 7w 8w
2w 2w 2w 3w 4w 4w 4w 4w 5w 6w 7w 7w 7w
3w 3w 3w 4w 4w 5w 5w 6w 6w 7w 8w 8w 8w
2w 3w 3w 3w 3w 4w 4w 5w 6w 7w 8w 8w 8w
2w 2w 2w 3w 4w 5w 6w 7w 7w 7w 4t 5t 6t
1w 1w 1w 2w 3w 4w 5w 6w 7w 8w 9w 9w 9w