一道比较消磨时间的简单题目。
#include <stdio.h>
#include <algorithm>
struct node
{
int num;
char color;
};
struct node b[5];
struct node w[5];
int cmp(const void *a, const void *b)
{
struct node *pa = (struct node*)a;
struct node *pb = (struct node*)b;
return pa->num - pb->num;
}
int get_type(struct node *p)
{
bool shunzi;
bool tonghua;
shunzi = tonghua = false;
if
(
p[1].num-p[0].num == 1 &&
p[2].num-p[1].num == 1 &&
p[3].num-p[2].num == 1 &&
p[4].num-p[3].num == 1
)
{
shunzi = true;
}
if
(
p[0].color == p[1].color &&
p[1].color == p[2].color &&
p[2].color == p[3].color &&
p[3].color == p[4].color
)
{
tonghua = true;
}
if(shunzi && tonghua)
return 8;
else if(shunzi)
return 4;
else if(tonghua)
return 5;
if
(
p[0].num == p[1].num &&
p[1].num == p[2].num &&
p[2].num == p[3].num
||
p[1].num == p[2].num &&
p[2].num == p[3].num &&
p[3].num == p[4].num
)
return 7;
if
(
p[0].num == p[1].num &&
p[1].num == p[2].num &&
p[3].num == p[4].num
||
p[0].num == p[1].num &&
p[2].num == p[3].num &&
p[3].num == p[4].num
)
return 6;
if
(
p[0].num == p[1].num &&
p[1].num == p[2].num
||
p[1].num == p[2].num &&
p[2].num == p[3].num
||
p[2].num == p[3].num &&
p[3].num == p[4].num
)
return 3;
if
(
p[0].num == p[1].num &&
p[2].num == p[3].num
||
p[0].num == p[1].num &&
p[3].num == p[4].num
||
p[1].num == p[2].num &&
p[3].num == p[4].num
)
return 2;
if
(
p[0].num == p[1].num ||
p[1].num == p[2].num ||
p[2].num == p[3].num ||
p[3].num == p[4].num
)
return 1;
return 0;
}
void func()
{
int type_w, type_b;
int value_w, value_b;
int temp_w[5], temp_b[5];
int win = 0; //1---black win 0--tie -1---white win
int i, j;
int pair_w, big_pair_w, small_pair_w;
int pair_b, big_pair_b, small_pair_b;
qsort(b, 5, sizeof(struct node), cmp);
qsort(w, 5, sizeof(struct node), cmp);
type_w = get_type(w);
type_b = get_type(b);
//printf("type_w=%d type_b=%d\n", type_w, type_b);
if(type_w > type_b)
{
win = -1;
goto last;
}
else if(type_w < type_b)
{
win = 1;
goto last;
}
else
{
switch(type_w)
{
case 0:
case 5:
//printf("w:%d %d %d %d %d\n", w[0].num, w[1].num, w[2].num, w[3].num, w[4].num);
//printf("b:%d %d %d %d %d\n", b[0].num, b[1].num, b[2].num, b[3].num, b[4].num);
value_w = w[0].num+w[1].num*15+w[2].num*15*15+w[3].num*15*15*15+w[4].num*15*15*15*15;
value_b = b[0].num+b[1].num*15+b[2].num*15*15+b[3].num*15*15*15+b[4].num*15*15*15*15;
if(value_b > value_w)
{
win = 1;
goto last;
}
else if(value_b < value_w)
{
win = -1;
goto last;
}
else
{
win = 0;
goto last;
}
break;
case 1:
for(i=0; i<=4; i++)
if(w[i].num == w[i+1].num)
{
pair_w = w[i].num;
w[i].num = w[i+1].num = 0;
}
for(i=0; i<=4; i++)
if(b[i].num == b[i+1].num)
{
pair_b = b[i].num;
b[i].num = b[i+1].num = 0;
}
if(pair_b > pair_w)
{
win = 1;
goto last;
}
else if(pair_b < pair_w)
{
win = -1;
goto last;
}
qsort(w, 5, sizeof(struct node), cmp);
qsort(b, 5, sizeof(struct node), cmp);
value_w = w[2].num+w[3].num*15+w[4].num*15*15;
value_b = b[2].num+b[3].num*15+b[4].num*15*15;
if(value_b > value_w)
{
win = 1;
goto last;
}
else if(value_b < value_w)
{
win = -1;
goto last;
}
else
{
win = 0;
goto last;
}
break;
case 2:
big_pair_b = big_pair_w = small_pair_b = small_pair_w = 0;
for(i=0; i<=4; i++)
if(w[i].num == w[i+1].num)
{
if(small_pair_w == 0)
small_pair_w = w[i].num;
else
big_pair_w = w[i].num;
w[i].num = w[i+1].num = 0;
}
for(i=0; i<=4; i++)
if(b[i].num == b[i+1].num)
{
if(small_pair_b == 0)
small_pair_b = b[i].num;
else
big_pair_b = b[i].num;
b[i].num = b[i+1].num = 0;
}
if(big_pair_b > big_pair_w)
{
win = 1;
goto last;
}
else if(big_pair_b < big_pair_w)
{
win = -1;
goto last;
}
if(small_pair_b > small_pair_w)
{
win = 1;
goto last;
}
else if(small_pair_b < small_pair_w)
{
win = -1;
goto last;
}
qsort(w, 5, sizeof(struct node), cmp);
qsort(b, 5, sizeof(struct node), cmp);
value_w = w[4].num;
value_b = b[4].num;
if(value_b > value_w)
{
win = 1;
goto last;
}
else if(value_b < value_w)
{
win = -1;
goto last;
}
else
{
win = 0;
goto last;
}
break;
case 3:
case 6:
case 7:
value_w = w[2].num;
value_b = b[2].num;
if(value_b > value_w)
{
win = 1;
goto last;
}
else if(value_b < value_w)
{
win = -1;
goto last;
}
else
{
win = 0;
goto last;
}
break;
case 4:
case 8:
value_w = w[4].num;
value_b = b[4].num;
if(value_b > value_w)
{
win = 1;
goto last;
}
else if(value_b < value_w)
{
win = -1;
goto last;
}
else
{
win = 0;
goto last;
}
break;
}
}
last:
if(1 == win)
printf("Black wins.\n");
else if(-1 == win)
printf("White wins.\n");
else
printf("Tie.\n");
}
int main(void)
{
int r;
int i;
char buffer[10];
int num;
char color;
while(1)
{
for(i=0; i<=9; i++)
{
r = scanf("%s", buffer);
if(r == EOF)
goto end;
switch(buffer[0])
{
case '2':
num = 2;
break;
case '3':
num = 3;
break;
case '4':
num = 4;
break;
case '5':
num = 5;
break;
case '6':
num = 6;
break;
case '7':
num = 7;
break;
case '8':
num = 8;
break;
case '9':
num = 9;
break;
case 'T':
num = 10;
break;
case 'J':
num = 11;
break;
case 'Q':
num = 12;
break;
case 'K':
num = 13;
break;
case 'A':
num = 14;
break;
}
color = buffer[1];
if(i<=4)
{
b[i].num = num;
b[i].color = color;
}
else
{
w[i-5].num = num;
w[i-5].color = color;
}
}
//printf("w:%d %d %d %d %d\n", w[0].num, w[1].num, w[2].num, w[3].num, w[4].num);
//printf("b:%d %d %d %d %d\n", b[0].num, b[1].num, b[2].num, b[3].num, b[4].num);
func();
}
end:
return 0;
}