这是 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:

  1. The black pieces can be arbitrary placed, and will not necessarily be located at places reachable in a legal game

  2. 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.

  3. A white piece can capture by jumping over a single black piece to the left, right or upwards, landing in the adjacent square

  4. 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

  5. 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).

  6. 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:

  1. 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

  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

  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

  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

  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

  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

  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

  8. 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

  9. 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

  10. 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

  11. 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

  12. 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的更多相关文章

  1. IEEEXtreme 10.0 - Inti Sets

    这是 meelo 原创的 IEEEXtreme极限编程大赛题解 Xtreme 10.0 - Inti Sets 题目来源 第10届IEEE极限编程大赛 https://www.hackerrank.c ...

  2. IEEEXtreme 10.0 - Painter's Dilemma

    这是 meelo 原创的 IEEEXtreme极限编程比赛题解 Xtreme 10.0 - Painter's Dilemma 题目来源 第10届IEEE极限编程大赛 https://www.hack ...

  3. IEEEXtreme 10.0 - Mysterious Maze

    这是 meelo 原创的 IEEEXtreme极限编程大赛题解 Xtreme 10.0 - Mysterious Maze 题目来源 第10届IEEE极限编程大赛 https://www.hacker ...

  4. IEEEXtreme 10.0 - Ellipse Art

    这是 meelo 原创的 IEEEXtreme极限编程大赛题解 Xtreme 10.0 - Ellipse Art 题目来源 第10届IEEE极限编程大赛 https://www.hackerrank ...

  5. IEEEXtreme 10.0 - Counting Molecules

    这是 meelo 原创的 IEEEXtreme极限编程大赛题解 Xtreme 10.0 - Counting Molecules 题目来源 第10届IEEE极限编程大赛 https://www.hac ...

  6. IEEEXtreme 10.0 - Game of Stones

    这是 meelo 原创的 IEEEXtreme极限编程大赛题解 Xtreme 10.0 - Game of Stones 题目来源 第10届IEEE极限编程大赛 https://www.hackerr ...

  7. IEEEXtreme 10.0 - Playing 20 Questions with an Unreliable Friend

    这是 meelo 原创的 IEEEXtreme极限编程大赛题解 Xtreme 10.0 - Playing 20 Questions with an Unreliable Friend 题目来源 第1 ...

  8. IEEEXtreme 10.0 - Full Adder

    这是 meelo 原创的 IEEEXtreme极限编程大赛题解 Xtreme 10.0 - Full Adder 题目来源 第10届IEEE极限编程大赛 https://www.hackerrank. ...

  9. IEEEXtreme 10.0 - N-Palindromes

    这是 meelo 原创的 IEEEXtreme极限编程大赛题解 Xtreme 10.0 - N-Palindromes 题目来源 第10届IEEE极限编程大赛 https://www.hackerra ...

随机推荐

  1. bzoj 1879 状压dp

    879: [Sdoi2009]Bill的挑战 Time Limit: 4 Sec  Memory Limit: 64 MBSubmit: 852  Solved: 435[Submit][Status ...

  2. SSH免密码登录,实现数据传输备份

    简单来说,就是通过ssh-keygen -t rsa命令来产生一组公私钥,私钥是id_rsa,公钥是id_rsa.pub,把公钥上传到另一台服务器对应账号的.ssh/authorized_keys,即 ...

  3. [吴恩达机器学习笔记]11机器学习系统设计3-4/查全率/查准率/F1分数

    11. 机器学习系统的设计 觉得有用的话,欢迎一起讨论相互学习~Follow Me 参考资料 斯坦福大学 2014 机器学习教程中文笔记 by 黄海广 11.3 偏斜类的误差度量 Error Metr ...

  4. conda 虚拟环境

    一.jupyter notbook (1)需要安装: conda install ipykernel (2)首先激活对应的conda环境 source activate 环境名称 (3)将环境写入no ...

  5. C11线程管理:线程创建

    1.线程的创建 C11创建线程非常简单,只需要提供线程函数就行,标准库提供线程库,并可以指定线程函数的参数. #include <iostream> #include <thread ...

  6. wampserver 虚拟主机

    转载:http://blog.csdn.net/knight_quan/article/details/51830683 1.背景: 在进行网站开发的时候,通常需要以http://localhost或 ...

  7. Metasploit 一些重要模块使用介绍

    本文是"T00LS Metasploit(第一季)"的文档版,是个人在观看视频动手操作的一个记录,仅供学习.文中会介绍Metasploit的一些基本使用:端口扫描.smb扫描.服务 ...

  8. Hibernate总结之Hello,World

    1. 引入相关maven依赖: <dependency> <groupId>org.hibernate</groupId> <artifactId>hi ...

  9. oracle01--单表查询

    1. 基本(基础)查询 1.1. 基本查询语法 基本查询是指最基本的select语句. [语法] [知识点]如何使用工具进行查询 在plsql developer中打开查询窗口(执行sql语句): 执 ...

  10. jQuery()方法的第二个参数详解

    关于jQuery()方法的第二个参数,有下面这几种用法: 1.jQuery(selector, [context]) 这种用法,相当于 $(context).find(selector) 或者 con ...