poj 2200 A Card Trick

用STL中的next_permutation枚举出所有情况判断一下就OK
#include <cstdio>
#include 
<cstring>
#include 
<iostream>
#include 
<algorithm>
using namespace std;
struct card
{
    
string str;
    
int v;
    
char ch;
}data[
5];
int n;

void init()
{
    
int i;
    
for ( i = 0 ; i < 5 ; i++ )
    {
        cin
>>data[i].str;
        
if ('2' <= data[i].str[0&& '9' >= data[i].str[0])
        {
            data[i].v
= data[i].str[0]-'0';
            data[i].ch
=data[i].str[1];
        }
        
else if ('1' == data[i].str[0])
        {
            data[i].v
=10;
            data[i].ch
=data[i].str[2];
        }
        
else if ( 'A' == data[i].str[0] )
        {
            data[i].v
=1;
            data[i].ch
=data[i].str[1];
        }
        
else if ( 'J' == data[i].str[0] )
        {
            data[i].v
=11;
            data[i].ch
=data[i].str[1];
        }
        
else if ('Q' == data[i].str[0])
        {
            data[i].v
=12;
            data[i].ch
=data[i].str[1];
        }
        
else if ('K' == data[i].str[0])
        {
            data[i].v
=13;
            data[i].ch
=data[i].str[1];
        }
    }
}

bool cmp(card i, card j)
{
    
if (i.v != j.v)
        
return i.v < j.v;
    
else
        
return i.ch < j.ch;
}

int find()
{
    
if (data[0].ch != data[1].ch)
        
return 0;
    
int i, min=data[2].v, k=2, t=data[1].v;
    
for ( i = 3; i < 5; i++ )
    {
        
if ( min > data[i].v )
        {
            min 
= data[i].v;
            k
= i;
        }
    }
    
if ( k == 2)
    {
        
if ( data[3].v == data[4].v )
        {
            
if ( data[3].ch > data[4].ch ) t+=3;
        }
        
else
        {
            
if (data[3].v > data[4].v) t+=3;
        }
    }
    
if ( k == 3)
    {
        
if ( data[2].v == data[4].v )
        {
            
if ( data[2].ch > data[4].ch ) t+=3;
        }
        
else
        {
            
if (data[2].v > data[4].v) t+=3;
        }
    }
    
if ( k == 4)
    {
        
if ( data[2].v == data[3].v )
        {
            
if ( data[2].ch > data[3].ch ) t+=3;
        }
        
else
        {
            
if (data[2].v > data[3].v) t+=3;
        }
    }
    t
+=k-1;
    
if ( t > 13) t-=13;
    
if ( t == data[0].v ) return 1;
    
else return 0;
}

void work()
{
    sort(data, data
+5, cmp);
    
do
    {
        
if(find()) return;
    }
    
while ( next_permutation(data, data+5, cmp));
}

int main()
{
    scanf(
"%d"&n);
    {
        
int i, k;
        
for ( k = 1 ; k <= n ; k++ )
        {
            init();
            work();
            printf(
"Problem %d:", k);
            
for ( i = 0 ; i < 5 ; i++ )
                printf(
" %s", data[i].str.c_str());
            putchar(
10);
        }
    }
    
return 0;
}

posted on 2011-08-05 23:10 purplest 阅读(270) 评论(0)  编辑 收藏 引用 所属分类: STL枚举


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理


<2011年10月>
2526272829301
2345678
9101112131415
16171819202122
23242526272829
303112345

导航

统计

常用链接

留言簿

随笔分类(70)

随笔档案(68)

ACMer

搜索

最新随笔

最新评论