当智力游戏遇到程序员(一 )三皇后
来源:互联网 发布:老男孩网络 编辑:程序博客网 时间:2024/04/30 19:41
手机上下载了一个智力游戏的软件,里面界面还不错,所以就留下来一直在玩。但其中有一些关卡确实很难,我有时也会跳过。但是突然就有个想法,想通过写写这些游戏的破解方案来锻炼自己写代码的能力,然后发现还附带了一些装B的能力,简直让我沉溺其中,所以可能会不断更新哦。这一次,先写一下国际象棋中三皇后的小游戏的破解。
游戏规则
在下面的棋盘中放置三个皇后棋子,让所有空白方块都可以被攻击,就这么简单。
破解思路
其实看到这关的时候,我连国际象棋怎么玩都不知道。但是通过上网查阅资料,发现皇后的攻击范围是:其所在的行,列,及两条对角线,一般来讲,就是其身边的八个方向。
于是乎,我就有了一点点想法,我要在这个 8*8 的棋盘的 64 个方块中随意选出三个方块来进行判断,也就是从 64 取 3 种可能性,再在这 7410 种情况中进行判断,找出符合游戏规则的解。虽然人脑来进行这么庞大的运算是不太可能的,但是程序完全可以啊,也就有了解决方案。
具体实现
在我的程序中,除了构造方法和main方法外,主要的方法有三个:一个用来将皇后身边的八个方向的空格全都“杀掉”,一个用来遍历出那 7410 种可能性,还有一个用来进行判断,满足条件则输出这三个皇后的位置。
程序如下:
public class ChessGame {public static final int N=6;public static final int Q=3;public static int [] rowQ = new int[Q];public static int [] colQ = new int[Q];public static int [][] chessBoard = new int[N][N]; public ChessGame(){for(int i=0; i<N; i++){for(int j=0; j<N; j++){chessBoard[i][j]=0;}}}public void queenKill(int x, int y){//走出八个方向int row=x, col=y;int x1=x, y1=y;int x2=x, y2=y;int x3=x, y3=y;int x4=x, y4=y;for(int i=0; i<N; i++){//行chessBoard[i][col]=1;}for(int j=0; j<N; j++){//列chessBoard[row][j]=1;}while(x1>=0&&y1>=0){//左上角对角线chessBoard[x1][y1]=1;x1--;y1--;}while(x2>=0&&y2<=5){//右上角对角线chessBoard[x2][y2]=1;x2--;y2++;}while(x3<=5&&y3<=5){//右下角对角线chessBoard[x3][y3]=1;x3++;y3++;}while(x4<=5&&y4>=0){//左上角对角线chessBoard[x4][y4]=1;x4++;y4--;}}public void findQueens(){//判断的方案//int count = 1;for(int i0=0; i0<N; i0++){//三个皇后可能的落点for(int j0=0; j0<N; j0++){if(i0==5&&j0>3) break;rowQ[0] = i0;colQ[0] = j0;int j1=j0+1;for(int i1=i0;i1<N;i1++){while(j1<N){if(i1==5&&j1>4) break;rowQ[1] = i1;colQ[1] = j1;int j2=j1+1;for(int i2=i1;i2<N;i2++){while(j2<N){if(i2==5&&j0>5) break;rowQ[2] = i2;colQ[2] = j2;//System.out.print(count+" ");//count++;// 必须先初始化for(int i=0; i<N; i++){for(int j=0; j<N; j++){chessBoard[i][j]=0;}}for(int k=0; k<3; k++){queenKill(rowQ[k], colQ[k]);//System.out.print(rowQ[k]);//System.out.print(colQ[k]);//System.out.print(" ");}//System.out.println();//for(int i=0; i<N; i++){//for(int j=0; j<N; j++){//System.out.print(chessBoard[i][j]);//System.out.print(" ");//}//System.out.println();//}solveTheProblem();j2++;}j2=0;}j1++;}j1=0;}}}}public void solveTheProblem(){boolean b=true;for(int iSTP=0; iSTP<N; iSTP++){for(int jSTP=0; jSTP<N; jSTP++){if(chessBoard[iSTP][jSTP]==0) {b=false;return;}}}if(b){for(int k=0; k<3; k++){//输出所要的三个皇后System.out.print(rowQ[k]);System.out.print(colQ[k]);System.out.print(" ");}System.out.println();}}public static void main(String[] args) {ChessGame cg = new ChessGame();//queenKill(0, 0);//queenKill(0, 1);//queenKill(2, 0);//for(int i=0; i<N; i++){//for(int j=0; j<N; j++){//System.out.print(chessBoard[i][j]);//System.out.print(" ");//}//System.out.println();//}cg.findQueens();}}程序跑出来是这个样子:
于是乎,游戏成功破解(下面分别是第二种和第三种解法):
0 0
- 当智力游戏遇到程序员(一 )三皇后
- 一个三皇后问题
- 智力游戏(1)
- 智力游戏(常胜将军)
- 程序员面试宝典之智力测试(一)
- 智力研究(一)
- 华容道(传统智力游戏)
- 当程序员遇到交警
- 智力游戏
- 智力游戏
- 智力游戏(搬山游戏)
- 《当程序员的那些狗日日子》(一)毕业后的徘徊
- 当游戏遇到Chrome操作系统
- 当ipad遇到60后
- 人鬼过河(智力游戏)
- 智力游戏(黑白子交换)
- 智力 Apple Watch 游戏 一、《上下棋手 Up-Down Chess》
- 编程解决各种问题(一) ----------------Flash 经典智力游戏(一) 人羊菜以及狼的故事
- .zip.001和.zip.002解压
- 直接插入排序-for语句实现
- PHP 5.6.10 编译安装
- 不能识别显示器的问题
- TextView的超链接
- 当智力游戏遇到程序员(一 )三皇后
- 2015062305 - 张瑞敏:人不成熟的五个特征(2)
- scrapy抓取知乎话题v0.1
- 利用MAT分析内存泄露
- Thikphp实现的图片上传
- 抽象工厂模式——探索之旅
- 2015062306 - 张瑞敏:人不成熟的五个特征(3)
- 选择排序-for语句实现
- mysql__事件