有关斯诺克的模拟题。

1、不犯规的情况下,打进几颗红球加几分

2、犯规的情况下,打进的红球不摆回球桌上,不加分

3、犯规的情况下,打进的彩球都要摆回球桌上,不加分

4、犯规的情况下,对手加的分数是这轮击球者所要击打的球的分数与打进的球的分数以及4取最大的值。

5、一些细节问题,自己需要注意。

#include <cstdio>
#include <cstring>struct Snooker{char name[2][30];int score[2];int ball_cnt[10];int red_cnt;int turn;int next;bool over;bool foul[5];int penalty;int ball_first;bool replaced[10];bool first;bool second;bool last;char stroke[2000];char ball_name[10];
}game;void init1()
{int i;game.score[0] = game.score[1] = 0;game.ball_cnt[1] = 15;for(i=2;i<=7;i++)game.ball_cnt[i] = 1;game.turn = 0;game.next = 1;game.last = false;game.over = false;
}void init2()
{game.red_cnt = 0;memset(game.foul,false,sizeof(game.foul));game.penalty = 4;game.ball_first = -1;memset(game.replaced,false,sizeof(game.replaced));game.first = game.second = false;
}int gao1()
{char ch[][10] = {"None","Red","Yellow","Green","Brown","Blue","Pink","Black","White"};for(int i=0;i<9;i++)if(strcmp(game.ball_name,ch[i])==0)return i;return -1;
}void gao2()
{int state = gao1();if(state==0)game.foul[0] = true;else {if(game.next == 1 && state > 1)game.foul[1] = true;else if(game.next > 1 && state == 1)game.foul[1] = true;else if(game.next <= 7 && game.next != state)game.foul[1] = true;}game.first = true;game.ball_first = state;
}void gao3()
{if(game.second){int state = gao1();if(game.ball_first != state)game.foul[2] = true;if(state > 7)game.foul[3] = true;if(state == 1)game.red_cnt++;game.replaced[state] = true;}
}void gao4()
{int i;if(game.last){if(game.foul[0] || game.foul[1] || game.foul[2] || game.foul[3]){printf("Foul!\n");game.score[game.turn^1] += 7;}else if(game.second)game.score[game.turn] += 7;game.turn^=1;printf("%d : %d\n",game.score[0],game.score[1]);if(game.foul[0] || game.foul[1] || game.foul[2] || game.foul[3] || game.second){if(game.score[0] == game.score[1]){printf("Tie\nRespot Black\n");game.next = 7;}else{if(game.score[0] > game.score[1])printf("%s wins\n",game.name[0]);elseprintf("%s wins\n",game.name[1]);game.over = true;}}elseprintf("%s's turn\n",game.name[game.turn]);return;}game.ball_cnt[1] -= game.red_cnt;if(game.foul[0] || game.foul[1] || game.foul[2] || game.foul[3]){printf("Foul!\n");game.turn^=1;game.score[game.turn] += game.penalty;printf("%d : %d\n",game.score[0],game.score[1]);if(game.replaced[2] || game.replaced[3] || game.replaced[4] || game.replaced[5] || game.replaced[6] || game.replaced[7]){char ch[][10] = {"","","Yellow","Green","Brown","Blue","Pink","Black"};printf("Respot");for(i=2;i<=7;i++){if(game.replaced[i])printf(" %s",ch[i]);}printf("\n");}for(i=1;i<=7;i++){if(game.ball_cnt[i] > 0){game.next = i;break;}}if(!game.foul[3])printf("%s's turn\n",game.name[game.turn]);elseprintf("%s's turn, in-hand\n",game.name[game.turn]);}else{if(game.next == 1)game.score[game.turn] += game.red_cnt;else if(game.second)game.score[game.turn] += game.ball_first;printf("%d : %d\n",game.score[0],game.score[1]);if(game.next == 8 && game.second){char ch[][10] = {"","","Yellow","Green","Brown","Blue","Pink","Black"};printf("Respot");for(i=2;i<=7;i++){if(game.replaced[i])printf(" %s",ch[i]);}printf("\n");}else{if(game.next > 1 && game.second){game.ball_cnt[game.next]--;if(game.ball_cnt[6] == 0)game.last = true;}}if(game.red_cnt > 0)game.next = 8;else{for(i=1;i<=7;i++){if(game.ball_cnt[i] > 0){game.next = i;break;}}}if(!game.second){game.turn^=1;printf("%s's turn\n",game.name[game.turn]);}}
}int Max(int a,int b)
{if(a > b)return a;return b;
}int main()
{int t,ca,len,i,fi;scanf("%d",&t);for(ca=1;ca<=t;ca++){if(ca>1)printf("\n");printf("Frame %d\n",ca);init1();scanf(" %s %s",game.name[0],game.name[1]);getchar();printf("%s's turn, in-hand\n",game.name[game.turn]);while(!game.over){gets(game.stroke);if(strcmp(game.stroke,"Play again")==0){game.turn^=1;if(!game.foul[3])printf("%s's turn\n",game.name[game.turn]);elseprintf("%s's turn, in-hand\n",game.name[game.turn]);continue;}if(strcmp(game.stroke,game.name[0])==0){game.turn=0;printf("%s's turn, in-hand\n",game.name[game.turn]);continue;}if(strcmp(game.stroke,game.name[1])==0){game.turn=1;printf("%s's turn, in-hand\n",game.name[game.turn]);continue;}len = strlen(game.stroke);init2();for(i=fi=0;i<len;i++){if(game.stroke[i] == ' ' || i + 1 == len){if(fi == 0)continue;if(i + 1 == len)game.ball_name[fi++] = game.stroke[i];if(gao1()<8)game.penalty = Max(game.penalty,gao1());if(!game.first)gao2();elsegame.second = true;gao3();fi = 0;memset(game.ball_name,'\0',sizeof(game.ball_name));}else{game.ball_name[fi++] = game.stroke[i];}}if(game.next<8)game.penalty = Max(game.penalty,game.next);gao4();}}return 0;
}

ZOJ 3426 HDU 3719 Snooker Referee相关推荐

  1. POJ 2777 ZOJ 1610 HDU 1698 --线段树--区间更新

    直接将这3题 放一起了  今天在做线段树的东西 这3个都是区间更新的 查询方式互相不同 反正都可以放到一起吧 直接先上链接了 touch me touch me touch me 关于涉及到区间的修改 ...

  2. poj 1564 Sum It Up | zoj 1711 | hdu 1548 (dfs + 剪枝 or 判重)

    Sum It Up Time Limit : 2000/1000ms (Java/Other)   Memory Limit : 65536/32768K (Java/Other) Total Sub ...

  3. poj 2096 , zoj 3329 , hdu 4035 —— 期望DP

    题目:http://poj.org/problem?id=2096 题目好长...意思就是每次出现 x 和 y,问期望几次 x 集齐 n 种,y 集齐 s 种: 所以设 f[i][j] 表示已经有几种 ...

  4. ZOJ 2334 HDU 1512 Monkey King

    题意: 猴子们打架  认识的猴子不会打架  两仅仅猴子打完以后就认识了  A认识B B认识C A也认识C  每次打架由两伙猴子进行  分别选出自己的最高战斗力  在战斗之后两仅仅猴子战斗力减半  给出 ...

  5. [kuangbin]各种各样的题单

    [kuangbin]各种各样的题单 专题1 简单搜索 POJ 1321 POJ 2251 POJ 3278 POJ 3279 POJ 1426 POJ 3126 POJ 3087 POJ 3414 F ...

  6. 【HDU/POJ/ZOJ】Calling Extraterrestrial Intelligence Again (素数打表模板)

    http://poj.org/problem?id=1411  POJ http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=168 ...

  7. HDU 3788 ZOJ问题

    http://acm.hdu.edu.cn/showproblem.php?pid=3788 上HDU看到滚动条'浙大研究生复试上机考试'最近热议的话题是考研的分数下来了.想直接找工作的我,也在犹豫的 ...

  8. 【转载】图论 500题——主要为hdu/poj/zoj

    转自--http://blog.csdn.net/qwe20060514/article/details/8112550 =============================以下是最小生成树+并 ...

  9. HDU 4430 amp; ZOJ 3665 Yukari#39;s Birthday(二分法+枚举)

    主题链接: HDU:http://acm.hdu.edu.cn/showproblem.php?pid=4430 ZJU:http://acm.zju.edu.cn/onlinejudge/showP ...

最新文章

  1. 红帽虚拟化RHEV-架构简介
  2. VMWare虚拟机迁移时,打开后提示主机不支持 CPUID 错误
  3. BZOJ4066:简单题(K-D Tree)
  4. l洛谷P4779 【模板】单源最短路径(标准版)(dijkstra)
  5. wordpress 主题开发
  6. 简单英文题 16 Maximum Sum Not Exceeding K(python)
  7. conda创建虚拟环境,拥有多个Anconda版本
  8. 自动论文生成器 python_python生成器
  9. 前端md转html添加样式_前端文档站点搭建方案
  10. [转]国内Linux操作系统发行商分类溯源
  11. ElasticSearch入门详解
  12. python进行中文文本聚类(切词以及Kmeans聚类)
  13. qq邮箱foxmail imap服务器,Foxmail如何设置IAMP邮箱
  14. Java使用while循环计算调和数列的和并打印
  15. 程序员是如何从小白做到年薪百万
  16. 2010-01-22 | 占豪收评:牛市继续还是进入熊市?
  17. 面向 Java 开发人员的区块链链代码
  18. 微信官方:“微信号能修改了!”你有多想修改微信号?
  19. 如何将计算机基础拷到u盘上,怎么把电脑上的CAD拷贝到u盘里
  20. 用C语言将整数翻译为英文,C语言实现翻译功能

热门文章

  1. 抖音吸粉_抖音上热门快速吸粉的6个方法,新手建议收藏看看
  2. 让linux识别html,8 款浏览器对 HTML5 支持评测
  3. android集成语音功能
  4. nvenc vs x264 对比(1)
  5. 揭秘小程序上线不到一周,每天2万销售额,究竟怎么做到的?
  6. BT源代码学习心得(九):客户端源代码分析(图形界面浅析) -- 转贴自 wolfenstein (NeverSayNever)
  7. 如何改变视频的MD5值?一分钟让你学会操作
  8. OSChina 周三乱弹 —— 以后面试可以说自己精通B站源码了吧
  9. redhat 下 oracle 10G RAC 集群 详细安装
  10. volumes-from 参数的一些试验