首先,在国际象棋中。八皇后是8*8棋盘,其中皇后可以直线行走,可以斜线行走,不分上下左右格数的。

附可行摆法:

所以,可归纳问题的条件为,8皇后之间需满足:

1.不在同一行上

             2.不在同一列上

             3.不在同一斜线上

             4.从第一行第一个开始往右走,对整行和整列和整个斜线看看有无皇后存在。无即可下皇后,然后跳到下一行继续。若有皇后则继续该行往右走,直到同行8个空格走完都无法下皇后的话,跳到上一行开始当前空格往右走。

将思路采用代码实现,使用0表示空,使用1表示皇后:

class EightQueen{public static int count=0;public static void main(String[] args){int[][] arr=new int[8][8];             //定义一个二维数组eightQueen(0,arr);                     //导入第0行,和定义的数组}public static void eightQueen(int row,int[][] arr){if(row==8){                            //当行数进行到8,角标为9时,前8行满足条件count++;                           //打印次数System.out.println("第"+count+"种情况:");for(int i=0;i<arr.length;i++){     //对行数进行定义for(int j=0;j<arr[i].length;j++){     //对行中的数值进行输出System.out.print(arr[i][j]+" ");  //输出01}System.out.println();                 //每行输出完了后换行}}else{//如果没进行到第八行int[][] newArr=new int[8][8];             //复制一份for(int i=0;i<newArr.length;i++){for(int j=0;j<newArr[i].length;j++){newArr[i][j]=arr[i][j];}}for(int j=0;j<8;j++){//如果row行j列没有危险if(noDangerous(row,j,newArr)){      //判断满足不满足规则for(int c=0;c<8;c++){           //把当前行都清空newArr[row][c]=0;           //全部赋值0}newArr[row][j]=1;               //该点位置满足规则,下皇后,赋值1eightQueen(row+1,newArr);       //到下一行}}}}public static boolean noDangerous(int row,int col,int[][] arr){//这是判断上方有无皇后的条件for(int r=row-1;r>=0;r--){            if(arr[r][col]==1){return false;                 //上方有值等于1的话则有皇后,返回false}}//这是判断左斜上方有无皇后的条件for(int r=row-1,c=col-1;r>=0&& c>=0;r--,c--){if(arr[r][c]==1){return false;                 //左斜上方的值有1的话则有皇后,返回false}}//这是判断右斜上方有无皇后的条件for(int r=row-1,c=col+1;r>=0&& c<8;r--,c++){if(arr[r][c]==1){return false;                 //右斜上方的值有1的话则有皇后,返回false}}return true;                  //上边三个判断都不满足时,则该位置满足规则,返回true}
}

五子棋,是一款经典游戏,棋盘规格为15*15,分为黑棋方和白棋方。根据规则,可归纳为。

1.左右上下,斜左斜右连有五个相同颜色棋子者获胜。

             2.全局游戏中,存在黑方胜利,白方胜利或者和局。将15*15的棋盘转换为二维数组,每下的一个位置相当于行列对应位置。每下一次要判断是否覆盖棋子,有覆盖则重新下棋,无覆盖则成功下期。每成功下了一次棋子后要对左右上下,斜左斜右进行判断,是否有连在一起的5个棋子。有则胜利,无则到下一方下棋。直到胜利的一方出现或者平局则游戏结束。

将思路采用代码实现,+ 代表棋盘的线的交点处,x代表黑方,0代表白方:

import java.util.Scanner;
class WuZiQi{//定义一个全局的棋盘public static String[][] board;//定义棋盘的尺寸size*size final类型 不可修改变量的值public static final int SIZE=15;public static final String NULL_CHESS="+ "; //空棋子public static final String BLACK_CHESS="X ";//黑棋子public static final String WHITE_CHESS="O ";//白棋子public static Scanner scanner=new Scanner(System.in);public static void main(String[] args){//制作棋盘initBoard();//打印棋盘showBoard();//开始游戏startGame();}public static void startGame(){int player=0;int result=0;while((result=isGameOver())==0){if(player%2==0){    //黑方System.out.println(">>>请黑方下棋:");if(!putChess(BLACK_CHESS)){System.out.println(">>>此处已有棋子,请从新下棋!");continue;}}else{              //白方System.out.println(">>>请白方下棋:");if(!putChess(WHITE_CHESS)){System.out.println(">>>此处已有棋子,请从新下棋!");continue;}}player++;}if(result==1){if(player%2==1){System.out.println(">>>游戏结束!黑方胜!");}else{System.out.println(">>>游戏结束!白方胜!");}}else{System.out.println(">>>游戏结束!和棋!");}}public static int isGameOver(){int count=0;//累计棋子的个数 然后再判断是否五子连珠for(int i=0;i<board.length;i++){for(int j=0;j<board[i].length;j++){if(!board[i][j].equals(NULL_CHESS)){count++;//当前的坐标 i j//向右 (i,j) (i,j+1) (i,j+2) (i,j+3) (i,j+4)if(j<11){if(board[i][j].equals(board[i][j+1])&&board[i][j].equals(board[i][j+2])&&board[i][j].equals(board[i][j+3])&&board[i][j].equals(board[i][j+4])){return 1;}}//向下if(i<11){if(board[i][j].equals(board[i+1][j])&&board[i][j].equals(board[i+2][j])&&board[i][j].equals(board[i+3][j])&&board[i][j].equals(board[i+4][j])){return 1;}}//向右下if(i<11&&j<11){if(board[i][j].equals(board[i+1][j+1])&&board[i][j].equals(board[i+2][j+2])&&board[i][j].equals(board[i+3][j+3])&&board[i][j].equals(board[i+4][j+4])){return 1;}}//向右上if(i>3&&j<11){if(board[i][j].equals(board[i-1][j+1])&&board[i][j].equals(board[i-2][j+2])&&board[i][j].equals(board[i-3][j+3])&&board[i][j].equals(board[i-4][j+4])){return 1;}}}}}//判断和棋 棋子数==SIZE*SIZEif(count==SIZE*SIZE){return 2;    }return 0;}public static boolean putChess(String chess){System.out.print(">>>x=");int x=scanner.nextInt()-1;  //x 行System.out.print(">>>y=");int y=scanner.nextInt()-1;  //y 列if(board[x][y].equals(NULL_CHESS)){board[x][y]=chess;showBoard();return true;    //已下}else{showBoard();return false;   //未下}}public static void showBoard(){System.out.print("  ");for(int i=1;i<=SIZE;i++){System.out.printf("%-2d",i);}System.out.println();int index=1;for(int i=0;i<board.length;i++){System.out.printf("%-3d",index++);for(int j=0;j<board[i].length;j++){System.out.print(board[i][j]);}System.out.println();}}public static void initBoard(){board=new String[SIZE][SIZE];   //字符串是引用数据类型 默认初始值nullfor(int i=0;i<board.length;i++){for(int j=0;j<board[i].length;j++){board[i][j]=NULL_CHESS;}}}
}

Java基础记忆12(八皇后算法和五子棋玩法)相关推荐

  1. Java基础系列12: 泛型

    Java基础系列12: 泛型 本文是作者的读书笔记和心得整理,部分内容来源于网络,如有侵权,请联系作者. 什么是泛型 直接看例子 List arrayList = new ArrayList(); a ...

  2. java编写八皇后算法

    /*** 八皇后* @Author:yangle* @Date:2020/9/23* @version:1.0*/ public class test {public static int num = ...

  3. 八皇后算法python_Python学习二(生成器和八皇后算法)

    看书看到迭代器和生成器了,一般的使用是没什么问题的,不过很多时候并不能用的很习惯 书中例举了经典的八皇后问题,作为一个程序员怎么能够放过做题的机会呢,于是乎先自己来一遍,于是有了下面这个ugly的代码 ...

  4. Java基础:JVM垃圾回收算法

    众所周知,Java的垃圾回收是不需要程序员去手动操控的,而是由JVM去完成.本文介绍JVM进行垃圾回收的各种算法. 1. 如何确定某个对象是垃圾 1.1. 引用计数法 1.2. 可达性分析 2. 典型 ...

  5. JAVA用爬山法解决八皇后问题_八皇后问题爬山法实现(C语言)

    1 #include 2 #include 3 #include 4 #include 5 // 6 //编程题7 //爬山法(八皇后问题)8 // 9 10 11 //棋子结构体12 //typed ...

  6. 前端开发:JS中关于八皇后算法的使用

    前言 在前端开发过程中,关于算法的使用也是非常常见的操作,尤其是处理一些复杂的业务场景,还有就是前端获取到后端返回的复杂结构的数据,所以说前端开发中处处都有算法使用的场景.开发者从接触编程开发开始,就 ...

  7. PHP实现八皇后算法-回溯算法

    回溯算法实际上一个类似枚举的搜索尝试过程,主要是在搜索尝试过程中寻找问题的解,当发现已不满足求解条件时,就"回溯"返回,尝试别的路径.回溯法是一种选优搜索法,按选优条件向前搜索,以 ...

  8. java 反射获取属性名和值_阿里P8架构师核心知识点整理:Java基础+spring原理+微服务+算法...

    Java基础 5.1.1. JAVA 异常分类及处理 5.1.1.1. 概念 如果某个方法不能按照正常的途径完成任务,就可以通过另一种路径退出方法.在这种情况下 会抛出一个封装了错误信息的对象.此时, ...

  9. Java基础教程(12)--深入理解类

    一.方法的返回值   当我们在程序中调用方法时,虚拟机将会跳转到对应的方法中去执行.当以下几种情况发生时,虚拟机将会回到调用方法的语句并继续向下执行: 执行完方法中所有的语句: 遇到return语句: ...

最新文章

  1. 更新不了_一个作者在起点中文网写小说,半年更新38万字,还是没签约成功
  2. PHP结合Ueditor并修改图片上传路径
  3. 递归-递归的特点及基本代码演练
  4. 持久化技术SharedPreferences存储
  5. linux常用命令 打开文件,【Linux】常用命令 lsof查看打开的文件
  6. 给广告打“保”字标、弄风险提示 百度搜索为用户旅游操碎了心
  7. python3 def download_python3下载抖音视频
  8. 基于SSH2做一个24小时订单分析表格
  9. PHPExcel 在LINUX环境中导出乱码的问题解决
  10. 尚硅谷mysql高级思维导图_幕布高级版,不花钱也能用!极简大纲笔记 | 一键生成思维导图...
  11. 常量、变量;基本数据类型;input()、if、while、break、continue
  12. Hadoop系列之MapReduce 数据本地化 (29)
  13. c语言编译bss和data,深入理解BSS段与data段的区别
  14. DRILLNET 2.0------第九章 套管设计模块
  15. 基于VS2015MFC在X86debug编译平台调试opengl 代码出现oxc0000007b错误的解决方法
  16. 关于RTMP推流直播摄像头最新问题解答
  17. 浅谈 Java 中的排序
  18. Illegal mix of collations (utf8mb4_0900_ai_ci,IMPLICIT) and (utf8mb4_general_ci,IMPLICIT) for operat
  19. 多线程练习:模拟多人爬山
  20. ArcGIS中将一个shp图层批量分割成单个的shp;shp批量转geojson

热门文章

  1. 哈佛大学公开课:计算机科学cs50 学习笔记及代码实现(第9集:归并排序)
  2. Python实现自动登录discuz论坛
  3. C/C++ 算法基础
  4. 微信支付服务器端demo,004-移动支付02-微信支付-服务器开发
  5. SLC MLC TLC QLC闪存颗粒
  6. 2022-2028全球及中国先进核磁共振成像可视化系统行业研究及十四五规划分析报告
  7. 简单的投票页面,只有一个html页面
  8. 为自动驾驶「打前战」,哪些细分领域是下一个「吸金」赛道
  9. 设计模式(八)Abstract Factory模式
  10. 当数学老师和软件测试,狸米老师app评测:小学数学老师布置作业的神器