九度oj 题目1363:欢乐斗地主
题目描述:
如果大家玩过欢乐斗地主这个游戏,就一定知道有一个具有“提示”功能的按钮。如果你不知道你现在手里的牌有没有比上家大的牌,并且你也懒得去一张一张地看你手中的牌。这时候你就可以点“提示”按钮,系统会告诉你是否有这样的牌。
如果你是一个喜欢挑战的人,你就一定会想,能不能写一个程序,让它实现欢乐斗地主中的“提示”按钮的功能。
现在,我们把“提示”按钮所具有的功能简化,它只需要找出在上家出的牌是“三带一对”的情况下你手中的牌是否比上家的牌大。
- 输入:
-
每组测试数据可能有多组输入,对于每一组输入,
输入的第一行包括一个整数N(1<=N<=18),代表你手中现在还剩下的扑克牌的张数。
接下来的一行包括N个数字(1-13,分别代表扑克牌中的A-K),给你的这N个数字是无序的。
接下来的一行包括五个数字,前三个数字是相同的,后两个数字是相同的,代表上家出的“三带一对”。
- 输出:
-
如果你手中的牌有比上家的“三带一对”大的,输出这样的牌,输出的格式与输入中的第三行相同,即五个数字:前三个是一样的,后两个是一样的,代表你手中的“三带一对”。如果你手中没有比上家的“三带一对”大的牌,请输出“My God”。
- 样例输入:
-
8
1 6 4 8 4 7 6 4
3 3 3 9 9
8
1 6 4 8 4 7 6 4
8 8 8 2 2
- 样例输出:
-
4 4 4 6 6
My God
- 提示:
-
1.“三带一对”:三张同样数字的牌+两张同样数字的牌,此时这五张牌可以同时出。“三带一对”比大小的规则如下——只需要比较三张同样数字的牌的数字的大小,而不需要考虑两张同样数字的牌的数字的大小。比如:“三个5带两个3”,比“三个4带两个8”要大。
2.大家都知道,在扑克牌中A和2要比3-K都要大,请大家在程序中进行处理。
3.如果你手中的牌有多种出法能够比上家的“三带一对”大,你需要选择“三带一对”中三张相同的牌数字较小的那种出法。比如说,如果上家出的牌是3 3 3 4 4,而你现在手中有6 6 6 7 7 7这6张牌,你需要出的牌是6 6 6 7 7,而不是7 7 7 6 6,如果三带最小的有多个,则需要输出一对值最小的那个结果。
4.你可以放心,我们发的牌以及出的牌中不会出现大小王。
一开始的代码是这样
#include <cstdio>
#include <cstring>
#include <algorithm> int card[];
int base[];
int n;
int num[] = {,,,,,,,,,,,,,};
int card2[];
int card3[]; int cmp(const void *a , const void *b) {
int at = *(int *)a;
int bt = *(int *)b;
return num[at] - num[bt];
}
int main(int argc, char const *argv[])
{
while(scanf("%d",&n) != EOF) {
for(int i = ; i < n; i++) {
scanf("%d",&card[i]);
}
for(int i = ; i < ; i++) {
scanf("%d",&base[i]);
}
qsort(card, n, sizeof(int), cmp);
int i = ;
int p2 = , p3 = ;
while(i < n) {
int cnt = ;
while(card[i] == card[i-]) {
cnt++;
i++;
}
if(cnt == ) {
card2[p2++] = card[i-];
}
else if(cnt == ) {
card3[p3++] = card[i-];
card2[p2++] = card[i-];
}
i++;
}
int t3 = -;
for(int j = ; j < p3; j++) {
if(num[card3[j]] > num[base[]]) {
t3 = card3[j];
break;
}
}
if(t3 == -) {
puts("My God");
continue;
}
int t2 = -;
for(int j = ; j < p2; j++) {
if(card2[j] != t3) {
t2 = card2[j];
break;
}
}
if(t2 == -) {
puts("My God");
continue;
}
printf("%d %d %d %d %d\n",t3,t3,t3,t2,t2);
}
return ;
}居然一个例子都没通过。
这段代码的两个问题,38行,cnt==4时没处理
31行,没判断i < n
修改如下
#include <cstdio>
#include <cstring>
#include <algorithm> int card[];
int base[];
int n;
int num[] = {,,,,,,,,,,,,,};
int card2[];
int card3[]; int cmp(const void *a , const void *b) {
int at = *(int *)a;
int bt = *(int *)b;
return num[at] - num[bt];
}
int main(int argc, char const *argv[])
{
while(scanf("%d",&n) != EOF) {
for(int i = ; i < n; i++) {
scanf("%d",&card[i]);
}
for(int i = ; i < ; i++) {
scanf("%d",&base[i]);
}
qsort(card, n, sizeof(int), cmp); /*for(int i = 0; i < n; i++) {
printf("%d ",card[i]);
}
puts("");*/
int i = ;
int p2 = , p3 = ;
while(i < n) {
int cnt = ;
while(i < n && card[i] == card[i-]) {
cnt++;
i++;
}
if(cnt >= ) {
card3[p3++] = card[i-];
card2[p2++] = card[i-];
}
else if(cnt >= ) {
card2[p2++] = card[i-];
}
i++;
}
int t3 = -;
for(int j = ; j < p3; j++) {
if(num[card3[j]] > num[base[]]) {
t3 = card3[j];
break;
}
}
if(t3 == -) {
puts("My God");
continue;
}
int t2 = -;
for(int j = ; j < p2; j++) {
if(card2[j] != t3) {
t2 = card2[j];
break;
}
}
if(t2 == -) {
puts("My God");
continue;
}
printf("%d %d %d %d %d\n",t3,t3,t3,t2,t2);
}
return ;
}当然,也可以换一种思路
#include <cstdio>
#include <cstring> int card[];
int num[] = {,,,,,,,,,,,,,,,};
int fnum[] = {,,,,,,,,,,,,,};
int n;
int m, p;
int main(int argc, char const *argv[])
{
while(scanf("%d",&n) != EOF) {
memset(card,,sizeof(card));
while(n--) {
int tmp;
scanf("%d",&tmp);
card[tmp]++;
}
scanf("%d %d %d %d %d",&m,&m,&m,&p,&p);
bool isFind = false;
for(int i = fnum[m]+; i <= && !isFind; i++) {
if(card[num[i]] >= ) {
for(int j = ; j <= && !isFind; j++) {
if(card[num[j]] >= && j != i) {
int t1 = num[i], t2 = num[j];
printf("%d %d %d %d %d\n",t1,t1,t1,t2,t2);
isFind = true;
}
}
}
}
if(!isFind) {
puts("My God");
}
}
return ;
}
最新文章
- linq语法大全(转集)
- 通过GP加载卫星云图-雷达图-降雨预报图
- Navicat 回复 psc 文件 Mysql
- try---catch异常处理
- 利用js轻松实现页面简繁体转换
- RouterOS软路由常用命令
- 【转】IoC/DIP其实是一种管理思想
- js之Function原型
- UVaLive 6802 Turtle Graphics (水题,模拟)
- C++:位操作基础篇之位操作全面总结
- Best Practice API
- pyqt pyside QLineEdit 重写键盘事件
- poj12482 扫描线+lazy-tag
- 【LeetCode】Binary Tree Upside Down
- 邮件服务端口 port 25、109、110、143、465、995、993
- UNP学习总结(二)
- pythonl练习笔记——python线程的GIL
- [转]Working with Transactions (EF6 Onwards)
- jmete察看结果树和body data乱码问题的解决办法
- hdu 5167(dfs)
热门文章
- [windows]窗口文件夹中使用常见任务
- 协议详解3——IP
- 设置DataGridView单元格的文本对齐方式
- 2018.4.19 远程服务器重装系统之后ssh无法登陆问题
- CPP-STL:vector中的size和capacity
- linux - mysql 安装教程
- 基于arcgis api for js高速公路智能化智慧公路养护WebGIS开源系统
- virtualvenv+django+uWSGI+nginx 部署 踩坑记录
- Neural Style论文笔记+源码解析
- [vijos]P1514 天才的记忆