题意 : 一共52张牌(A, 2, 3, 4, 5, 6, 7, 8, 9, 10, J, Q, K)花色分别是C,D,H,S 。。。给助理5张牌,然后助理需要重新排一下次序,把第一张牌给观众,然后让魔术师根据一个规律对剩下的有一定次序的牌,能够猜出观众手里的牌是哪张。规律是:
- 记下剩下的四张牌里第一张的值和花色。
- 然后剩下三张,找出最小的那张(按值大小排,如果值一样大按照花色排序,花色的顺序是CDHS)所在的位置然后把这个位置的值加到原来记下的第一张牌的值上。
- 除了最小的那张,还有两张大的,如果这两张是有序的就把将第二步得到的值再加3.
- 所以观众手里的牌的值就是经过上述三步加起来的值,花色就是原来记下的第一张牌的花色。
比如说 4D 5H 10C 10D QH,助理需要按照5H QH 10D 10C 4D这个顺序,将5H给观众,然后将QH 10D 10C 4D给魔术师,因为魔术师手里第一张牌的花色是H,所以观众手里那张牌的花色是H,然后魔术师手里的第一张值是12,加上剩下的牌里最小的4D所在的位置3,是15,取完余就是2,然后因为10D和10C是无序的,所以要再加3,就是5,所以观众手里的牌是5H .
思路 : 这个题要猜的话不怎么好猜,所以就是两个循环枚举一下,然后再处理一下小细节什么的。取余那个地方有特例所以要注意
1 //POJ 2200 2 #include <stdio.h> 3 #include <string.h> 4 #include <iostream> 5 #include <algorithm> 6 7 using namespace std ; 8 9 char str[5][4] ; 10 //char ch[5][4] ; 11 int e ; 12 struct node 13 { 14 int num ; 15 int flo ; 16 } a[10],ch[10] ; 17 18 int cmp(struct node a,struct node b) 19 { 20 if(a.num == b.num) 21 return a.flo < b.flo ; 22 return a.num < b.num ; 23 } 24 void inv() 25 { 26 for(int j = 0 ; j < 5 ; j++) 27 { 28 int len = strlen(str[j]) ; 29 if(len == 3) a[j].num = 10; 30 if(str[j][0] == 'J') a[j].num = 11 ; 31 else if(str[j][0] == 'Q') a[j].num = 12 ; 32 else if(str[j][0] == 'K') a[j].num = 13 ; 33 else if(str[j][0] == 'A') a[j].num = 1 ; 34 else if(str[j][0] >= '2' && str[j][0] <= '9') a[j].num = str[j][0]-'0' ; 35 if(str[j][len-1] == 'C') a[j].flo = 1 ; 36 if(str[j][len-1] == 'D') a[j].flo = 2 ; 37 if(str[j][len-1] == 'H') a[j].flo = 3 ; 38 if(str[j][len-1] == 'S') a[j].flo = 4 ; 39 40 } 41 } 42 43 void judge(struct node a) 44 { 45 if(a.num == 1) 46 printf("%c",'A') ; 47 else if(a.num == 10) 48 printf("10") ; 49 else if(a.num == 11) 50 printf("J") ; 51 else if(a.num == 12) 52 printf("Q") ; 53 else if(a.num == 13) 54 printf("K") ; 55 else printf("%d",a.num) ; 56 if(a.flo == 4) 57 printf("S") ; 58 else if(a.flo == 3) 59 printf("H") ; 60 else if(a.flo == 2) 61 printf("D") ; 62 else if(a.flo == 1) 63 printf("C") ; 64 } 65 void solve() 66 { 67 int j ; 68 for(int i = 0 ; i < 5 ; i++) 69 { 70 for(j = 0 ; j < 5 ; j++) 71 { 72 if(i != j && a[i].flo == a[j].flo) 73 { 74 e = 0 ; 75 for(int k = 0 ; k < 5 ; k++) 76 { if(k != i && k != j) 77 { 78 ch[e].num = a[k].num ; 79 ch[e].flo = a[k].flo ; 80 e++ ; 81 //strcpy(ch[e++],str[k]) ; 82 } 83 } 84 sort(ch,ch+e,cmp) ; 85 int a1 = a[i].num ; 86 int a2 = a[j].num ; 87 if( a1 == (a2+1)%13 || (a1 == 13&&a2 == 12) ) 88 { 89 printf("%s %s ",str[i],str[j]); 90 judge(ch[0]) ; 91 printf(" ") ; 92 judge(ch[1]) ; 93 printf(" ") ; 94 judge(ch[2]) ; 95 printf("\n") ; 96 break; 97 } 98 else if(a1 == (a2+2)%13 || (a1 == 13 && a2 == 11) ) 99 { 100 printf("%s %s ",str[i],str[j]); 101 judge(ch[1]) ; 102 printf(" ") ; 103 judge(ch[0]) ; 104 printf(" ") ; 105 judge(ch[2]) ; 106 printf("\n") ; 107 break; 108 } 109 else if(a1 == (a2+3)%13 || (a1 == 13 && a2 == 10) ) 110 { 111 printf("%s %s ",str[i],str[j]); 112 judge(ch[1]) ; 113 printf(" ") ; 114 judge(ch[2]) ; 115 printf(" ") ; 116 judge(ch[0]) ; 117 printf("\n") ; 118 break; 119 } 120 else if(a1 == (a2+4)%13 || (a1 == 13 && a2 == 9) ) 121 { 122 printf("%s %s ",str[i],str[j]); 123 judge(ch[0]) ; 124 printf(" ") ; 125 judge(ch[2]) ; 126 printf(" ") ; 127 judge(ch[1]) ; 128 printf("\n") ; 129 break; 130 } 131 else if(a1 == (a2+5)%13 || (a1 == 13 && a2 == 8) ) 132 { 133 printf("%s %s ",str[i],str[j]); 134 judge(ch[2]) ; 135 printf(" ") ; 136 judge(ch[0]) ; 137 printf(" ") ; 138 judge(ch[1]) ; 139 printf("\n") ; 140 break; 141 } 142 else if(a1 == (a2+6)%13 || (a1 == 13 && a2 == 7) ) 143 { 144 printf("%s %s ",str[i],str[j]); 145 judge(ch[2]) ; 146 printf(" ") ; 147 judge(ch[1]) ; 148 printf(" ") ; 149 judge(ch[0]) ; 150 printf("\n") ; 151 break; 152 } 153 } 154 } 155 if(j < 5) break ; 156 } 157 } 158 int main() 159 { 160 int n ; 161 scanf("%d",&n) ; 162 for(int i = 1 ; i <= n ; i++ ) 163 { 164 for(int j = 0 ; j < 5 ; j++) 165 scanf("%s",str[j]) ; 166 inv() ; 167 printf("Problem %d: ",i) ; 168 solve() ; 169 } 170 return 0 ; 171 }