程序员面试金典——解题总结: 9.17中等难题 17.2判断井字游戏中某个玩家是否赢了游戏
2017-01-16 00:13
323 查看
#include <iostream> #include <stdio.h> #include <vector> using namespace std; /* 问题:设计一个算法,判断玩家是否赢了井字游戏 分析:首先井字游戏是跟五子棋类似,任意连线上有三个子就算成功 现在是判断某个玩家是否赢了游戏。 赢: 1) 任意一行3个连续的子 2) 列 3) 斜线 最简单的方法就是:每次轮到某个棋手落子后,判断该棋手棋子的颜色,以及该棋子所在行,或所在列,或所在斜线(如果有的话),是否有三个和它颜色相同 的棋子 时间复杂度:每个棋子都需要判断遍历2行到3行,设棋盘长宽为n*m,所以时间复杂度为: O(n*m*m) = o(n*m^2)接近O(n^2)这种 输入: 3(棋盘的宽度) 3(棋盘的高度) 关键: 1 棋子除了黑白两种颜色外,注意要设置空, */ const int MAXSIZE = 1000; //需要定义棋子这个对象,包含颜色,横纵坐标。颜色中为空,表示该棋子还没有落下 enum Color{EMPTY , WHITE , BLACK}; typedef struct Chessman { int _x; int _y; Color _color; }Chessman; //输入参数为当前棋子,棋盘的宽和高,棋盘矩阵,赢所需要的棋子个数 bool isWin(Chessman& chessman, int width , int height , vector< vector<Chessman> >& chessBoard , int winNum) { int x = chessman._x; int y = chessman._y; Color color = chessman._color; //检查所在行是否有3个同样颜色的棋子 int count = 0; for(int i = y ; i < width ; i++) { //如果出现了不同的颜色,需要,直接退出 if( chessBoard.at(x).at(i)._color != color) { break; } count++; } for(int i = y - 1 ; i >= 0 ; i--) { //如果出现了不同的颜色,需要,直接退出 if( chessBoard.at(x).at(i)._color != color) { break; } count++; } if(count < winNum) { return false; } //检索所在列是否有3个同样地棋子 count = 0; for(int i = x ; i < height; i++) { if( chessBoard.at(i).at(y)._color != color) { break; } count++; } for(int i = x - 1 ; i >= 0 ; i++ ) { if( chessBoard.at(i).at(y)._color != color) { break; } count++; } if(count < winNum) { return false; } //判断所在斜线是否连成一行 count = 0; int tempX = x , tempY = y; while( tempX < height && tempY < width ) { if( chessBoard.at(tempX).at(tempY)._color != color ) { break; } count++; tempX++; tempY++; } tempX = x - 1 ; tempY = y - 1; while(tempX >= 0 && tempY >= 0) { if( chessBoard.at(tempX).at(tempY)._color != color ) { break; } count++; tempX--; tempY--; } if(count < winNum) { return false; } return true; } int main(int argc , char* argv[]) { getchar(); return 0; }
相关文章推荐
- 程序员面试金典——解题总结: 9.17中等难题 17.3设计一个算法,算出n阶乘有多少个尾随0
- 程序员面试金典——解题总结: 9.17中等难题 17.8给定一个整数数组(有正数有负数),找出总和最大的连续数列,并返回总和
- 程序员面试金典——解题总结: 9.17中等难题 17.4编写一个方法,找出两个数字中最大的那一个。不得使用if-else或其他比较运算符。
- 程序员面试金典——解题总结: 9.17中等难题 17.6给定一个整数数组,编写一个函数,找出索引m和n,只要将m和n之间的元素排好序,整个数组就是有序的。注意:n - m越小越好,也就是说,找出
- 程序员面试金典——解题总结: 9.17中等难题 17.11给定rand5(),实现一个方法rand7()。也就是,给定一个产生0到4(含)随机数的方法,编写一个产生0到6(含)随机数的方法
- 程序员面试金典——解题总结: 9.17中等难题 17.7给定一个整数,打印该整数的英文描述(例如 "One Thousand,Two Hundred-Thirty Four")
- 程序员面试金典——解题总结: 9.17中等难题 17.13将二叉查找树转换为双向链表
- 程序员面试金典——解题总结: 9.17中等难题 17.12设计一个算法,找出数组中两数之和为指定值的所有整数对。
- 程序员面试金典——解题总结: 9.17中等难题 17.5珠玑妙算游戏
- 程序员面试金典——解题总结: 9.17中等难题 17.9设计一个方法,找出任意指定单词在一本书中的出现频率
- 程序员面试金典——解题总结: 9.17中等难题 17.14句子分割
- 程序员面试金典——解题总结: 9.17中等难题 17.1编写一个函数,不用临时变量,直接交换两个数
- 设计一个算法,判断玩家是否赢了井字游戏
- CareerCup 17中等难题 Q17.2 井字游戏
- 我要学C#语言程序设计【解题篇】(二):输入三个整数,判断是否能够组成三角形
- 在游戏中判断网络是否连接
- 汇编知识总结--第二部分(判断指令是否正确)
- 判断N 数码是否有解 牛人总结 归并排序
- AWK使用总结(5)使用AWK判断是否为中文字符
- C#自我总结:判断是否接入互联网!