IEEEXtreme 10.0 - Checkers Challenge
这是 meelo 原创的 IEEEXtreme极限编程大赛题解
Xtreme 10.0 - Checkers Challenge
题目来源 第10届IEEE极限编程大赛
https://www.hackerrank.com/contests/ieeextreme-challenges/challenges/draughts-1
Watch the following YouTube video clip. Your task is to compute the number of possible ways the white player can win from an opening state of a single white piece in a game of Turkish Draughts. For more information on the game, you can view the Wikipedia page.
For this challenge, we will use the following variation on the official rules:
The black pieces can be arbitrary placed, and will not necessarily be located at places reachable in a legal game
A single white piece is a king if, and only if, it is placed in or reaches the top most line. Once a piece is a king it remains a king throughout.
A white piece can capture by jumping over a single black piece to the left, right or upwards, landing in the adjacent square
A white king can capture by jumping left, right, upwards or backwards and can skip arbitrary number of blank squares before and after the black piece
After capturing a black piece, the white piece (or king) must turn 90 degrees or keep moving in the same direction (no 180 degree turns are allowed).
We ask for the number of different ways the white player can win a single move. White wins by capturing all black pieces.
Input Format
Each input begins with an integer t, on a line by itself, indicating how many testcases are present.
Each testcase will contain 8 lines with the state of the board. The board will have a single white piece o, some black pieces x, and empty places .. White's side of the board is at the bottom of the board. So if the white piece were to reach to top row of the board, it would become a king.
In between each testcase is a blank line.
Constraints
1 ≤ t ≤ 5
There will always be at least 1, and no more than 16, black pieces in each game.
The game board will always be 8x8 squares in size.
Output Format
For each testcase, output, on a line by itself, the number of possible ways the white can win, or 0 if he cannot.
Sample Input
3
.......o
.x.x.x..
xxxx.xx.
........
........
.x.xx..x
x.......
..x...x.
........
........
....o...
........
....x...
........
........
........
...o....
........
...x....
........
........
........
........
........
Sample Output
12
0
5
Explanation
The first testcase is the state of the board in the 56th second of the YouTube video. There are 12 ways in which this game can be won. These ways are represented below:
down 7, left 3, up 6, left 2, down 4, right 4, up 4, left 3, down 4, left 3, up 4, right 5, down 6, left 5, up 5, right 2
down 7, left 3, up 6, left 2, down 4, right 4, up 4, left 3, down 4, left 3, up 4, right 5, down 6, left 5, up 5, right 3
down 7, left 3, up 6, left 2, down 4, right 4, up 4, left 3, down 4, left 3, up 4, right 5, down 6, left 5, up 5, right 4
down 7, left 3, up 6, left 2, down 4, right 4, up 4, left 3, down 4, left 3, up 4, right 5, down 6, left 5, up 5, right 5
down 7, left 3, up 6, left 2, down 4, right 4, up 4, left 3, down 4, left 3, up 4, right 5, down 6, left 5, up 5, right 6
down 7, left 3, up 6, left 2, down 4, right 4, up 4, left 3, down 4, left 3, up 4, right 5, down 6, left 5, up 5, right 7
down 7, left 3, up 6, right 2, down 4, left 4, up 4, right 3, down 4, left 5, up 4, right 3, down 6, left 3, up 5, right 2
down 7, left 3, up 6, right 2, down 4, left 4, up 4, right 3, down 4, left 5, up 4, right 3, down 6, left 3, up 5, right 3
down 7, left 3, up 6, right 2, down 4, left 4, up 4, right 3, down 4, left 5, up 4, right 3, down 6, left 3, up 5, right 4
down 7, left 3, up 6, right 2, down 4, left 4, up 4, right 3, down 4, left 5, up 4, right 3, down 6, left 3, up 5, right 5
down 7, left 3, up 6, right 2, down 4, left 4, up 4, right 3, down 4, left 5, up 4, right 3, down 6, left 3, up 5, right 6
down 7, left 3, up 6, right 2, down 4, left 4, up 4, right 3, down 4, left 5, up 4, right 3, down 6, left 3, up 5, right 7
There is no way for white to win the second testcase.
For the final testcase, white has a king, and white can capture the single black piece, and land on any of the five spaces below the piece.
题目解析
这题是一个搜索题,用深度优先搜索可以解决。
题目中的游戏规则比较复杂,一定要仔细阅读。最初没有注意到,普通白子不能向下走,浪费了很多时间。
使用回溯法可以避免保存状态。
程序
C++
#include <cmath>
#include <cstdio>
#include <vector>
#include <iostream>
#include <algorithm>
using namespace std;
// check whether (x,y) is a legal location
bool legal(int x, int y) {
return (x>=) && (x<) && (y>=) && (y<);
}
/**
board: 8x8 array representing the game board
isKing: whether white piece is king
wx: white piece's location on x axis
wy: white piece's location on y axis
lastDir: direction of last move, valid value are -1, 0, 1, 2, 3, -1 represents initial move
numBlack: number of black pieces on board
*/
int countWin(char board[][], bool isKing, int wx, int wy, int lastDir, int numBlack) {
int count = ; // game over, white piece win
if(numBlack == ) return ; int dir[][] = { {,}, {,-}, {-,}, {,} };
int bx, by; // black piece to the left, right or upwards
int sx, sy; // landing square if(!isKing) {
// cannot go downwards, possible directions: 0, 1, 2
for(int d=; d<; d++) { bx = wx + dir[d][];
by = wy + dir[d][];
sx = wx + dir[d][] * ;
sy = wy + dir[d][] * ; if(board[bx][by]=='x' && legal(sx, sy) && board[sx][sy]=='.') {
if(sx == ) isKing = true;
board[bx][by] = '.';
numBlack--;
count += countWin(board, isKing, sx, sy, d, numBlack);
// backtrack
board[bx][by] = 'x';
numBlack++;
}
}
}
else {
for(int d=; d<; d++) {
if((d== && lastDir==) || (d== && lastDir==) ||
(d== && lastDir==) || (d== && lastDir==)) {
continue;
}
bx = by = -;
// white king can go at least 1 step, at most 6 steps
for(int skipBefore=; skipBefore<=; skipBefore++) {
int tx = wx + dir[d][] * skipBefore;
int ty = wy + dir[d][] * skipBefore;
if(legal(tx, ty) && board[tx][ty]=='x') {
bx = tx;
by = ty;
break;
}
}
//cout << bx << ' ' << by << endl;
if(!legal(bx, by)) continue;
for(int skipAfter=; skipAfter<=; skipAfter++) {
int tx = bx + dir[d][] * skipAfter;
int ty = by + dir[d][] * skipAfter;
if(legal(tx, ty) && board[tx][ty]=='.') {
board[bx][by] = '.';
numBlack--;
int C = countWin(board, isKing, tx, ty, d, numBlack);
count += C;
// backtrack
board[bx][by] = 'x';
numBlack++;
}
else {
break;
} }
}
} return count;
} int main() {
int T;
cin >> T;
for(int t=; t<T; t++) {
char board[][];
for(int l=; l<; l++) {
cin >> board[l];
} // check whether white piece is king or not
bool isKing = false;
for(int c=; c<; c++) {
if(board[][c] == 'o') isKing = true;
} // locate white piece
int wx, wy, numBlack = ;
for(int l=; l<; l++) {
for(int c=; c<; c++) {
if(board[l][c] == 'o') {
wx = l;
wy = c;
board[l][c] = '.';
}
else if(board[l][c] == 'x') {
numBlack++;
}
}
}
cout << countWin(board, isKing, wx, wy, -, numBlack) << endl;
getchar();
}
return ;
}
博客中的文章均为 meelo 原创,请务必以链接形式注明 本文地址
IEEEXtreme 10.0 - Checkers Challenge的更多相关文章
- IEEEXtreme 10.0 - Inti Sets
这是 meelo 原创的 IEEEXtreme极限编程大赛题解 Xtreme 10.0 - Inti Sets 题目来源 第10届IEEE极限编程大赛 https://www.hackerrank.c ...
- IEEEXtreme 10.0 - Painter's Dilemma
这是 meelo 原创的 IEEEXtreme极限编程比赛题解 Xtreme 10.0 - Painter's Dilemma 题目来源 第10届IEEE极限编程大赛 https://www.hack ...
- IEEEXtreme 10.0 - Mysterious Maze
这是 meelo 原创的 IEEEXtreme极限编程大赛题解 Xtreme 10.0 - Mysterious Maze 题目来源 第10届IEEE极限编程大赛 https://www.hacker ...
- IEEEXtreme 10.0 - Ellipse Art
这是 meelo 原创的 IEEEXtreme极限编程大赛题解 Xtreme 10.0 - Ellipse Art 题目来源 第10届IEEE极限编程大赛 https://www.hackerrank ...
- IEEEXtreme 10.0 - Counting Molecules
这是 meelo 原创的 IEEEXtreme极限编程大赛题解 Xtreme 10.0 - Counting Molecules 题目来源 第10届IEEE极限编程大赛 https://www.hac ...
- IEEEXtreme 10.0 - Game of Stones
这是 meelo 原创的 IEEEXtreme极限编程大赛题解 Xtreme 10.0 - Game of Stones 题目来源 第10届IEEE极限编程大赛 https://www.hackerr ...
- IEEEXtreme 10.0 - Playing 20 Questions with an Unreliable Friend
这是 meelo 原创的 IEEEXtreme极限编程大赛题解 Xtreme 10.0 - Playing 20 Questions with an Unreliable Friend 题目来源 第1 ...
- IEEEXtreme 10.0 - Full Adder
这是 meelo 原创的 IEEEXtreme极限编程大赛题解 Xtreme 10.0 - Full Adder 题目来源 第10届IEEE极限编程大赛 https://www.hackerrank. ...
- IEEEXtreme 10.0 - N-Palindromes
这是 meelo 原创的 IEEEXtreme极限编程大赛题解 Xtreme 10.0 - N-Palindromes 题目来源 第10届IEEE极限编程大赛 https://www.hackerra ...
随机推荐
- bzoj 3834 [Poi2014]Solar Panels 数论分块
3834: [Poi2014]Solar Panels Time Limit: 20 Sec Memory Limit: 128 MBSubmit: 367 Solved: 285[Submit] ...
- 【转】解决virt-manager启动管理器出错:unsupported format character
来源:http://blog.csdn.net/z_yttt/article/details/71192144 经验证OK. 今天打开virt-manager出错,报错信息如下: 启动管理器出错: ...
- libuv移植到ios
libuv官网只提供了os x的编译方法,没有IOS的.既然os x和ios的系统内核差不多,并且编译工具都是xcode,那我们只要重新指定cpu架构,就可以编译出ios版的了. 1.安装python ...
- OpenCV---模糊操作
推文:图像平滑处理(归一化块滤波.高斯滤波.中值滤波.双边滤波) 推文:图像的平滑与滤波 模糊操作 三种模糊操作方式 均值模糊 中值模糊 自定义模糊(可以实现上面两种模糊方式) 原理: 图像处理:基础 ...
- NOIP模拟5
期望得分:100+100+100=300 实际得分:72+12+0=84 T1 [CQOI2009]中位数图 令c[i]表示前i个数中,比d大的数与比d小的数的差,那么如果c[l]=c[r],则[l ...
- IIC总线学习
IIC总线 IIC协议简要说明: 1.2条双向串行线,一条数据线称为SDA,一条时钟线SCL,双向半双工 2.传输的设备之间只是简单的主从关系,主机可以作为主机发送也可以作为主机接收,任何时候只能由一 ...
- 教你Snapseed软件八个常用调图工具
教你Snapseed软件八个常用调图工具 教你Snapseed(指划修图)软件八个常用调图工具 老阿·编写 Snapseed是目前手机摄影修图中功能最强大的一款软件,很多功能很像电脑用的Photosh ...
- JSON 为王,为什么 XML 会慢慢淡出人们的视野?
目前全球信息基础设施的特点是,拥有大量的数据交换格式.这一点也不奇怪.互联网几乎已经老了,而“物联网”及“大数据”正从概念走进现实.但我仍然相信,在这一领域还有一股较强的历史趋势,推动 JSON 数据 ...
- 【BZOJ】1901: Zju2112 Dynamic Rankings
[题意]带修改的查询区间第k小 [算法]树状数组套可持久化线段树 [题解]对于树状数组上的每个节点,维护可持久化权值线段树(节点为权值),从而达到查询前缀和的目的. 对于每次修改,在待修改线段树基础上 ...
- 【BZOJ】3143: [Hnoi2013]游走 期望+高斯消元
[题意]给定n个点m条边的无向连通图,每条路径的代价是其编号大小,每个点等概率往周围走,要求给所有边编号,使得从1到n的期望总分最小(求该总分).n<=500. [算法]期望+高斯消元 [题解] ...