您的位置:首页 > 其它

POJ1059 Chutes and Ladders

2013-11-11 18:28 344 查看
题目来源:http://poj.org/problem?id=1059

题目大意:

  有一种叫做“ChutesandLadders”(梯子和滑梯)的简单游戏。游戏在一块棋盘上进行,棋盘上有编号从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的整数表示起点和终点。当遇到一行“00”时表示该部分结束。

  第三部分:棋盘中的“miss-a-turn”格和“extra-turn”格。每行一个,如果数字是负数说明是“miss-a-turn”,正数说明是“extra-turn”(例如:-15表示15号格是"miss-a-turn"格,25表示25号格是“extra-turn”).0表示该部分结束。

输出:每轮游戏对应1行,输出该轮游戏的赢家编号,输入已保证会找到赢家。

SampleInput

3632513423120
2
695
991
00
-3
98
0
2
399
690
00
0
0

SampleOutput

2
2


模拟题水过。


////////////////////////////////////////////////////////////////
//POJ1059ChutesandLadders
//Memory:228KTime:0MS
//Language:C++Result:Accepted
///////////////////////////////////////////////////////////////

#include<iostream>
#include<algorithm>

usingnamespacestd;

structLadder{
intstart;
intend;
};

intdie[1000];
intcounter[6];
booltrapped[6];
intplayer_num;
Ladderladders[200];
intladder_cnt;
boolmiss_turn[101];
boolextra_turn[101];

intcmp(Ladder&a,Ladder&b){
returna.start<=b.start;
}

intbin_seach(intv,ints,inte){
if(s>v||v>ladders[e].start||v<ladders[s].start){
return-1;
}
intmid=(s+e)/2;
if(v==ladders[mid].start){
returnladders[mid].end;
}elseif(v<ladders[mid].start){
returnbin_seach(v,s,mid-1);
}else{
returnbin_seach(v,mid+1,e);
}
}

intmain(void){

//读入色子投掷结果
for(inti=0;i<1000;++i){
cin>>die[i];
if(die[i]==0){
break;
}
}

while(cin>>player_num&&player_num>0){

//读取玩家数
memset(miss_turn,false,sizeof(miss_turn));
memset(extra_turn,false,sizeof(extra_turn));
memset(counter,0,sizeof(counter));
memset(ladders,0,sizeof(ladders));
ladder_cnt=0;

//读取ladders
while(true){
cin>>ladders[ladder_cnt].start>>ladders[ladder_cnt].end;
if(ladders[ladder_cnt].start==0){
break;
}
++ladder_cnt;
}

//ladders排序
sort(ladders,ladders+ladder_cnt,cmp);

//读入miss-a-turn和extra-turn
while(true){
intt;
cin>>t;
if(t>0){
extra_turn[t]=true;
}elseif(t<0){
miss_turn[-1*t]=true;
}else{
break;
}
}

//Gamestarts!
intplayer_id=0;
intdie_pointer=0;
while(true){

intcurrent=counter[player_id];//当前位置
intdie_num=die[die_pointer++];//色子投掷结果
intdes=current+die_num;//目标位置

if(current==100){
cout<<player_id+1<<endl;
break;
}

//当前玩家被困
if(trapped[player_id]){
trapped[player_id++]=false;
player_id%=player_num;
continue;
}

//恰好到达终点,结束
if(des==100){
cout<<player_id+1<<endl;
break;
}
//超过100,忽略该次
elseif(des>100){
(++player_id)%=player_num;
continue;
}

counter[player_id]=des;

//判断该处是否有ladder或chute
des=bin_seach(counter[player_id],0,ladder_cnt-1);
if(des!=-1){
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;
}
}
return0;
}


ViewCode

                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: