[CareerCup] 17.2 Tic Tac Toe 井字棋游戏
17.2 Design an algorithm to figure out if someone has won a game oftic-tac-toe.
这道题让我们判断玩家是否能赢井字棋游戏,有下面几点需要考虑:
1. 判断是否能赢hasWon函数是调用一次还是多次,如果是多次,我们可能为了优化而需要加入一些预处理。
2. 井字棋游戏通常是3x3的大小,我们是否想要实现NxN的大小?
3. 我们需要在代码紧凑,执行速度和代码清晰之间做出选择。
#include <iostream>
#include <string>
#include <vector>
#include <ctime> using namespace std; int convertBoardToInt(vector<string> board) {
int factor = , sum = ;
for (int i = ; i < board.size(); ++i) {
for (int j = ; j < board[i].size(); ++j) {
int v = ;
if (board[i][j] == 'x') v = ;
else if (board[i][j] == 'o') v = ;
sum += v * factor;
factor *= ;
}
}
return sum;
} enum class Piece {Empty, Red, Blue}; enum class Check {Row, Column, Diagonal, ReverseDiagonal}; Piece getIthColor(vector<vector<Piece>> board, int idx, int var, Check check) {
int N = board.size();
if (check == Check::Row) {
return board[idx][var];
} else if (check == Check::Column) {
return board[var][idx];
} else if (check == Check::Diagonal) {
return board[var][var];
} else if (check == Check::ReverseDiagonal) {
return board[N - - var][var];
}
return Piece::Empty;
} Piece getWinner(vector<vector<Piece>> board, int fixed_idx, Check check) {
Piece color = getIthColor(board, fixed_idx, , check);
if (color == Piece::Empty) {
return Piece::Empty;
}
for (int var = ; var < board.size(); ++var) {
if (color != getIthColor(board, fixed_idx, var, check)) {
return Piece::Empty;
}
}
return color;
} // work for 3*3 board
Piece hasWon1(vector<vector<Piece>> board) {
for (int i = ; i < board.size(); ++i) {
if (board[i][] != Piece::Empty && board[i][] == board[i][] && board[i][] == board[i][]) {
return board[i][];
}
if (board[][i] != Piece::Empty && board[][i] == board[][i] && board[][i] == board[][i]) {
return board[][i];
}
}
if (board[][] != Piece::Empty && board[][] == board[][] && board[][] == board[][]) {
return board[][];
}
if (board[][] != Piece::Empty && board[][] == board[][] && board[][] == board[][]) {
return board[][];
}
return Piece::Empty;
} // N*N board
Piece hasWon2(vector<vector<Piece>> board) {
int N = board.size();
Piece winner = Piece::Empty;
for (int i = ; i < N; ++i) {
winner = getWinner(board, i, Check::Row);
if (winner != Piece::Empty) return winner;
winner = getWinner(board, i, Check::Column);
if (winner != Piece::Empty) return winner;
}
winner = getWinner(board, -, Check::Diagonal);
if (winner != Piece::Empty) return winner;
winner = getWinner(board, -, Check::ReverseDiagonal);
if (winner != Piece::Empty) return winner;
return Piece::Empty;
} // N*N board
Piece hasWon3(vector<vector<Piece>> board) {
int N = board.size(), row = , col = ;
for (row = ; row < N; ++row) {
if (board[row][] != Piece::Empty) {
for (col = ; col < N; ++col) {
if (board[row][col] != board[row][col - ]) {
break;
}
}
if (col == N) return board[row][];
}
}
for (col = ; col < N; ++col) {
if (board[][col] != Piece::Empty) {
for (row = ; row < N; ++row) {
if (board[row][col] != board[row - ][col]) {
break;
}
}
if (row == N) return board[][col];
}
}
if (board[][] != Piece::Empty) {
for (row = ; row < N; ++row) {
if (board[row][row] != board[row - ][row - ]) {
break;
}
}
if (row == N) return board[][];
}
if (board[N - ][] != Piece::Empty) {
for (row = ; row < N; ++row) {
if (board[N - row - ][row] != board[N - row][row - ]) {
break;
}
}
if (row == N) return board[N - ][];
}
return Piece::Empty;
} // N*N board
Piece hasWon4(vector<vector<Piece>> board) {
int N = board.size(), i = , j = ;
vector<Piece> pieces{Piece::Red, Piece::Blue};
for (Piece color : pieces) {
for (i = ; i < N; ++i) {
bool maybe_col = true, maybe_row = true;
for (j = ; j < N; ++j) {
if (board[i][j] != color) maybe_row = false;
if (board[j][i] != color) maybe_col = false;
}
if (maybe_col || maybe_row) return color;
}
bool maybe_diag = true, maybe_revdiag = true;
for (i = ; i < N; ++i) {
if (board[i][i] != color) maybe_diag = false;
if (board[N - i - ][i] != color) maybe_revdiag = false;
}
if (maybe_diag || maybe_revdiag) return color;
}
return Piece::Empty;
} Piece convertIntToPiece(int i) {
if (i == ) {
return Piece::Blue;
} else if (i == ) {
return Piece::Red;
} else {
return Piece::Empty;
}
} void printVec(vector<vector<int>> v) {
for (int i = ; i < v.size(); ++i) {
for (int j = ; j < v[i].size(); ++j) {
cout << v[i][j] << " ";
}
cout << endl;
}
cout << endl;
} void printPiece(Piece p) {
if (p == Piece::Empty) cout << "Empty" << endl;
else if (p == Piece::Red) cout << "Red" << endl;
else if (p == Piece::Blue) cout << "Blue" << endl;
} int main() {
srand(time(NULL));
for (int k = ; k < ; ++k) {
int N = ;
vector<vector<int>> v(N, vector<int>(N, ));
vector<vector<Piece>> board(N, vector<Piece>(N));
for (int i = ; i < N; ++i) {
for (int j = ; j < N; ++j) {
v[i][j] = rand() % ;
board[i][j] = convertIntToPiece(v[i][j]);
}
}
Piece p1 = hasWon1(board);
Piece p2 = hasWon2(board);
Piece p3 = hasWon3(board);
Piece p4 = hasWon4(board);
if (p1 != p2 || p2 != p3 || p3 != p4) {
printPiece(p1);
printPiece(p2);
printPiece(p3);
printPiece(p4);
printVec(v);
}
cout << endl;
}
}
[CareerCup] 17.2 Tic Tac Toe 井字棋游戏的更多相关文章
- [LeetCode] Design Tic-Tac-Toe 设计井字棋游戏
Design a Tic-tac-toe game that is played between two players on a n x n grid. You may assume the fol ...
- 井字棋游戏升级版 - TopTicTacToe项目 简介
一.游戏简介 井字棋是一款世界闻名的游戏,不用我说,你一定知道它的游戏规则. 这款游戏简单易学,玩起来很有意思,不过已经证明出这款游戏如果两个玩家都足够聪明的话, 是很容易无法分出胜负的,即我们得到的 ...
- C++井字棋游戏,DOS界面版
据说有一个能保证不败的算法.明天看看先再写个PVC版的. 正题.今天无聊写了个井字棋游戏,顺便逐渐让自己习惯良好的代码风格,放上来给新手学习学习. jzq2.cpp /* N字棋游戏PVP版,DOS版 ...
- JavaFX 井字棋游戏
利用JavaFX设计一个井字棋游戏,其中包括了能够与玩家对战的AI.AI的实现相比五子棋来说要简单得多,可以保证AI在后手情况下绝对不会输,具体实现如下: /* * To change this li ...
- Java井字棋游戏
试着写了一个井字棋游戏,希望各位能给予一些宝贵的建议. 一.棋盘类 package 井字棋游戏; public class ChessBoard { private int number; Perso ...
- [LeetCode] 348. Design Tic-Tac-Toe 设计井字棋游戏
Design a Tic-tac-toe game that is played between two players on a n x n grid. You may assume the fol ...
- [C++] 井字棋游戏源码
TicTac.h #define EX 1 //该点左鼠标 #define OH 2 //该点右鼠标 class CMyApp : public CWinApp { public: virtual B ...
- [Swift]LeetCode348. 设计井字棋游戏 $ Design Tic-Tac-Toe
Design a Tic-tac-toe game that is played between two players on a n x n grid. You may assume the fol ...
- Raptor井字棋游戏
作为大学第一个小作品,记录一下,也给那些想接触到Raptor游戏的人一个小小的参考QAQ至于Raptor的语法和使用,可以参考一下他的帮助手册,看不懂英文的话可以复制放到翻译上看. 以上是主函数 以下 ...
随机推荐
- slidedoor滑动门特效
slidedoor滑动门特效 exportWidth:暴露门的宽度 width imagesWidth:单张图片的宽度width 每道门每次偏移量 translate=imagesWidth-expo ...
- javascript是判断对象是否是数组
JS中的数据类型: 2大类 原始类型:值保存在变量本地的数据类型 5种:Number String Boolean undefined null Number:8bytes 舍入误差-->四舍五 ...
- JavaScript中Array类型方法总结
Array类型是ECMAScript中最常用的类型之一,ECMAScript中的数组与其他多数语言中的数组有着相当大的区别.ECMAScript数组的每一项可以保存任何类型的数据.这里总结了数组类型的 ...
- Android细笔记--ContentProvider
Provider的不常见访问方式 Batch access:访问ContentProvider的一中模式,使用该模式可以同时对provider进行多个操作,且支持同时操作多个表.使用时首先构建一个Co ...
- 【Lucene】三个高亮显示模块的简单示例-Highlighter
Lucene针对高亮显示功能提供了两种实现方式,分别是Highlighter和FastVectorHighlighter 这里的三个示例都是使用Highlighter: 示例代码: package c ...
- css sprite 调整大张图片中小图标的大小
直接说解决方法: 假设一张拼合好的大图大小是:900 x 1000 px (如上图) 现在想取图中左上角的河马图标,并缩小图标的大小. 正常取图: .sprite { background: url( ...
- AEAI Portal V3.5.4升级说明,门户集成平台
1 总体说明 本次升级是AEAI Portal的一次重要升级,主要扩展了开发社区(论坛).移动门户功能,同时修正一些功能BUG等,具体内容如下: 2 升级内容 功能扩展: 扩展开发社区导航 扩展移动门 ...
- TNS-12540: TNS:internal limit restriction exceeded
应用程序以及客户端工具(Toad.PL/SQL Developer等)出现突然连接不上数据库服务器的情况,监听日志listener.log里面出现了TSN-12518与TSN-12540错误,如下所示 ...
- 深入解析Windows操作系统笔记——CH2系统结构
2.系统结构 本章主要介绍系统的总体结构,关键部件之间的交互,以及运行在什么环境. 2.系统结构 2.1 需求和设计目标 2.2 操作系统模型 2.3 总体结构 2.3.1 可移植性 2.3.2 对称 ...
- python time和datetime的常用转换处理
一.time 1.获取当前时间和时区 >>> now = time.time() # 当前时间 float类型 >>> time.strftime("%Y ...