POJ1059 Chutes and Ladders
题目来源:http://poj.org/problem?id=1059
题目大意:
有一种叫做“Chutes and Ladders”(梯子和滑梯)的简单游戏。游戏在一块棋盘上进行,棋盘上有编号从1-100的格子,玩家们从假定的编号为0的格子处出发。各玩家轮流投掷色子(上有数字1-6),色子的数字表示玩家在棋盘上将前进的步数,最先到达100号格子的玩家胜利。
当然游戏不会仅仅这么无聊。在棋盘上不同的格子之间可能通过Ladder(梯子,从编号小的格子连至编号大的格子)和“Chute”(滑梯,从编号大的格子连至编号小的格子)连接起来。如果,一次投色子后前进到达的格子处是ladder或chute的起点,则玩家将到达ladder或chute通向的格子。注意:终点格子处的ladder和chute都是无效的,但起点处的有效。
此外,有一些特殊的格子:写有“miss-a-turn”的格子表示玩家一旦到达它们,将失去下一轮的投色子前进机会,写有“extra-turn”的格子表示玩家可以立即再投一次色子再前进一次。起点和终点处的格子都不会是这两种特殊格子。
如果一个玩家当前处于编号95以上的格子处,如果它们投掷的色子使它们前进的终点超过了100,那么这次这次投掷将被忽略。
输入:输入的开始为少于1000次的色子投掷结果,每个都是1到6的整数,由6表示结束。
接下来是一个或多个游戏数据集。每个数据集包含三个部分。
第一部分:一行表示游戏中的玩家数,多于1少于6。
第二部分:棋盘中的ladders和chutes. ladders和chutes每个都由两个1-99的整数表示起点和终点。当遇到一行“0 0”时表示该部分结束。
第三部分:棋盘中的“miss-a-turn”格和“extra-turn”格。每行一个,如果数字是负数说明是“miss-a-turn”, 正数说明是“extra-turn”(例如:-15表示15号格是"miss-a-turn"格, 25表示25号格是“extra-turn”).0表示该部分结束。
输出:每轮游戏对应1行,输出该轮游戏的赢家编号,输入已保证会找到赢家。
Sample Input
3 6 3 2 5 1 3 4 2 3 1 2 0
2
6 95
99 1
0 0
-3
98
0
2
3 99
6 90
0 0
0
0
Sample Output
2
2
模拟题水过。
////////////////////////////////////////////////////////////////
// POJ1059 Chutes and Ladders
// Memory: 228K Time: 0MS
// Language: C++ Result : Accepted
/////////////////////////////////////////////////////////////// #include <iostream>
#include <algorithm> using namespace std; struct Ladder {
int start;
int end;
}; int die[];
int counter[];
bool trapped[];
int player_num;
Ladder ladders[];
int ladder_cnt;
bool miss_turn[];
bool extra_turn[]; int cmp(Ladder &a, Ladder &b) {
return a.start <= b.start;
} int bin_seach(int v, int s, int e) {
if (s > v || v > ladders[e].start || v < ladders[s].start) {
return -;
}
int mid = (s + e) / ;
if (v == ladders[mid].start) {
return ladders[mid].end;
} else if (v < ladders[mid].start) {
return bin_seach(v, s, mid - );
} else {
return bin_seach(v, mid + , e);
}
} int main(void) { //读入色子投掷结果
for (int i = ; i < ; ++i) {
cin >> die[i];
if (die[i] == ) {
break;
}
} while (cin >> player_num && player_num > ) { //读取玩家数
memset(miss_turn, false, sizeof(miss_turn));
memset(extra_turn, false, sizeof(extra_turn));
memset(counter, , sizeof(counter));
memset(ladders, , sizeof(ladders));
ladder_cnt = ; //读取ladders
while (true) {
cin >> ladders[ladder_cnt].start >> ladders[ladder_cnt].end;
if (ladders[ladder_cnt].start == ) {
break;
}
++ladder_cnt;
} //ladders排序
sort(ladders, ladders + ladder_cnt, cmp); //读入miss-a-turn和extra-turn
while (true) {
int t;
cin >> t;
if (t > ) {
extra_turn[t] = true;
} else if (t < ) {
miss_turn[- * t] = true;
} else {
break;
}
} //Game starts!
int player_id = ;
int die_pointer = ;
while (true) { int current = counter[player_id]; //当前位置
int die_num = die[die_pointer++]; //色子投掷结果
int des = current + die_num; //目标位置 if (current == ) {
cout << player_id + << endl;
break;
} //当前玩家被困
if (trapped[player_id]) {
trapped[player_id++] = false;
player_id %= player_num;
continue;
} //恰好到达终点,结束
if (des == ) {
cout << player_id + << endl;
break;
}
//超过100,忽略该次
else if (des > ) {
(++player_id) %= player_num;
continue;
} counter[player_id] = des; //判断该处是否有ladder或chute
des = bin_seach(counter[player_id], , ladder_cnt - );
if (des != -) {
counter[player_id] = des;
} //判断该处是否为miss-a-turn或extra-turn
if (miss_turn[counter[player_id]] == true) {
trapped[player_id] = true;
}
if (extra_turn[counter[player_id]] == true) {
continue;
}
(++player_id) %= player_num;
}
}
return ;
}
POJ1059 Chutes and Ladders的更多相关文章
- POJ题目排序的Java程序
POJ 排序的思想就是根据选取范围的题目的totalSubmittedNumber和totalAcceptedNumber计算一个avgAcceptRate. 每一道题都有一个value,value ...
- Swift流程控制之循环语句和判断语句详解
Swift提供了所有c类语言的控制流结构.包括for和while循环来执行一个任务多次:if和switch语句来执行确定的条件下不同的分支的代码:break和continue关键字能将运行流程转到你代 ...
- Swift编程语言学习4.1——周期
Swift它提供了类似 C 流量控制结构语言,它包含运行多个任务的能力for和while周期.选择根据不同的编码分支机构的具体条件来运行if和switch声明,有控制流程跳转到其他代码break和co ...
- 精选 TOP45 值得学习的Python项目
精选 TOP45 值得学习的Python项目 [导读]热门资源博客 Mybridge AI 比较了 18000 个关于 Python 的项目,并从中精选出 45 个最具竞争力的项目.我们进行了翻译,在 ...
- 值得收藏的45个Python优质资源
REST API:使用 Python,Flask,Flask-RESTful 和 Flask-SQLAlchemy 构建专业的 REST API https://www.udemy.com/rest- ...
- Welcome-to-Swift-05控制流(Control Flow )
Swift提供了所有c类语言的控制流结构.包括for和while循环来执行一个任务多次:if和switch语句来执行确定的条件下不同的分支的代码:break和continue关键字能将运行流程转到你代 ...
- 值得收藏的45个Python优质资源(附链接)
REST API:使用 Python,Flask,Flask-RESTful 和 Flask-SQLAlchemy 构建专业的 REST API https://www.udemy.com/rest- ...
- Python学习教程(十)精选 TOP45 值得学习的Python项目
精选 TOP45 值得学习的Python项目 [导读]热门资源博客 Mybridge AI 比较了 18000 个关于 Python 的项目,并从中精选出 45 个最具竞争力的项目.我们进行了翻译,在 ...
- [lightoj P1151] Snakes and Ladders
1151 - Snakes and Ladders Time Limit: 2 second(s) Memory Limit: 32 MB 'Snakes and Ladders' or 'Sh ...
随机推荐
- Markdown编辑器及图床推荐
Typora和自动图床工具 Typora 地址 ,极致简洁,界面很漂亮,最重要的是所见即所得 百度云搬运 密码:xi01 自动图床工具 需要七牛云做图床,感谢作者,详见博客 使用方法,只需两步即可完成 ...
- Eclipse中,将tab缩进改为4个空格
用4个空格来缩进 , 不要用Tab来缩进 , 因为Tab在不同平台的点位不一样 eclipse->preferences->General->Editors->Text Edi ...
- 未找到与约束contractname Microsoft.VisualStudio.Utilities.IContentTypeRegistryService...匹配的导出
***以下操作后一定要重启VS,重启VS,重启VS重要的事情说三遍*** //************************************************************* ...
- python笔记--3--函数、生成器、装饰器、函数嵌套定义、函数柯里化
函数 函数定义语法: def 函数名([参数列表]): '''注释''' 函数体 函数形参不需要声明其类型,也不需要指定函数返回值类型 即使该函数不需要接收任何参数,也必须保留一对空的圆括号 括号后面 ...
- Hibernate和JPA
ORM(Object/Relational Mapping : 对象关系映射)就是利用描述对象和数据库之间映射的元数据,自动(且透明)的将java应用程序中的对象持久化到关系数据库的表中.HIbern ...
- JDBC MySQL 实例之 用户管理系统
1 Java 和 MySQL 怎么建立连接 2 通过Java怎么对数据库进行操作 package day01; import java.sql.Connection; import java.sql. ...
- 神奇的overflow:hidden及其背后的原理
先来看两个overflow:hidden的使用例子 1.嵌套布局内部块元素设置float:left时,导致外部元素塌方,高度为0的问题. <div class="wrap"& ...
- 《Spring实战》-1
1.Spring的主要特性:依赖注入DI和面向切面编程AOP. 2.关键策略: 轻量级和最小侵入性编程:POJO 松耦合:DI和AOP 声明式编程:切面和惯例 减少样板式代码:切面和模板 3.Spri ...
- fiddler----APP弱网测试
转自:http://www.51testing.com/html/01/n-3727001.html APP弱网模拟测试 移动端测试区别于PC端测试的一点就是网络的多变性:不同的网络环境和网络制式的差 ...
- 修改Oracle游标数及排查游标问题相关SQL
查看当前游标数show parameter open_cursors; 修改游标最大数 ; commit; 查看游标消费情况 select o.sid, osuser, machine, count( ...