[OJ]1013: 狐狸与小狗
Description
Upwinder最近喜欢上了一款古老的起源于Scandinavia(斯堪迪纳维亚半岛)的小游戏。具体的游戏规则如下:
1. 棋盘设定
棋盘的大小为8行8列,有两个玩家:狐狸和小狗。初始的时候有4只小狗被放置在棋盘最上边一行的4个黑色格子里;而1只狐狸被放在最下边一行的某个黑色格子里。以棋盘左上角为原点,向下为行的正方向,向右为列的正方向,从1开始给每一个格子编号.
2. 移动规则
(1) 两个玩家轮流下棋。
(2) 狐狸每轮可以斜着向上或斜着向下移动至相邻的一个空格子,只能移动一步;
(3) 小狗每轮只能斜着向下移动至相邻的一个空格子,只能移动一只,且只能移动一步;
(4) 显然根据移动规则棋盘中只有黑色的格子才能放棋子
3. 游戏目标
狐狸与小狗的目标是不同的。
(1) 如果小狗将狐狸围住致使其无法移动(包括围在边界),那么小狗获胜。
(2) 如果狐狸到达了棋盘最上方一行的任意一个黑色格子,那么狐狸获胜;
特别的,游戏不存在平局或死局,而且如果4只小狗均无法移动,则狐狸可以一直移动直至取胜。
现在告诉你游戏过程中的某一个局面,你能帮Upwinder判断如果狐狸与小狗均采取最优策略的话,谁能取得最后的胜利吗?
Input
第一行一个数字T表示接下来有T(T<=3000)种局面。
对于每一种局面,由三行数据组成,其中:
第一行为整数0或1。0代表当前狐狸掌握棋权,1代表当前小狗掌握棋权。
第二行为两个整数,以空格分隔,依次是狐狸在棋盘上的行坐标Fr和列坐标Fl。
第三行为八个整数,以空格分隔,依次是第一只小狗的行坐标Dr1,列坐标Dl1……以此类推。
Output
对于每一种局面,仅输出一行。
如果狐狸能够取胜,请输出“Fox win
”(不含引号)
如果小狗能够取胜,请输出“Dog win
”(不含引号)
#include <stdio.h> typedef struct{ int x; int y; }P; int chess(int s, P *f, P *d){ int i,j; if(f->x < 1 || f->x > 8 || f->y < 1 || f->y > 8){ return -1; } for(i=0; i<4; i++){ if(d[i].x < 1 || d[i].x > 8 || d[i].y < 1 || d[i].y > 8){ return -1; } if(d[i].x == f->x && d[i].y == f->y){ return -1; } for(j=0;j<4;j++){ if(i != j && d[j].x == d[i].x && d[j].y == d[i].y){ return -1; } } } for(i=0;i<4;i++){ if(f->y > d[i].y){ break; } } if(i==4){ return 0; } if(s==0){ f->x--; f->y--; i = chess(1, f, d); if(i>=0) return i; f->x; f->y+=2; i = chess(1, f, d); if(i>=0) return i; f->x+=2; f->y; i = chess(1, f, d); if(i>=0) return i; f->x; f->y-=2; i = chess(1, f, d); if(i>=0) return i; f->x--; f->y++; //fox cannot move to any other point, game over. if(f->y == 1){ return 0; }else{ return 1; } }else{ for(j=0; j<4; j++){ d[j].x++; d[j].y++; i = chess(0, f, d); if(i>0) return i; d[j].x-=2; d[j].y; i = chess(0, f, d); if(i>0) return i; d[j].x++; d[j].y--; } //dog cannot move to any other point, fox is the leader. return chess(0, f, d); } } void main(){ int t,s,ret; P f,d[4]; scanf(" %d", &t); while(t--){ scanf(" %d", &s); scanf(" %d %d", &f.x, &f.y); scanf(" %d %d %d %d %d %d %d %d", &d[0].x, &d[0].y, &d[1].x, &d[1].y, &d[2].x, &d[2].y, &d[3].x, &d[3].y); ret = chess(s, &f, d); if(ret == 0){ printf("Fox win\n"); }else{ printf("Dog win\n"); } } }
标签: C
日历
最新微语
- 有的时候,会站在分叉路口,不知道向左还是右
2023-12-26 15:34
- 繁花乱开,鸟雀逐风。心自宁静,纷扰不闻。
2023-03-14 09:56
- 对于不可控的事,我们保持乐观,对于可控的事情,我们保持谨慎。
2023-02-09 11:03
- 小时候,
暑假意味着无忧无虑地玩很长一段时间,
节假意味着好吃好喝还有很多长期不见的小朋友来玩...
长大后,
这是女儿第一个暑假,
一个半月...
2022-07-11 08:54
- Watching the autumn leaves falling as you grow older together
2018-10-25 09:45
分类
最新评论
- Goonog
i get it now :) - 萧
@Fluzak:The web host... - Fluzak
Nice blog here! Also... - Albertarive
In my opinion you co... - ChesterHep
What does it plan? - ChesterHep
No, opposite. - mojoheadz
Everything is OK!... - Josephmaigh
I just want to say t... - ChesterHep
What good topic - AnthonyBub
Certainly, never it ...
发表评论: