井字棋博弈问题

伪代码如下:

//1表示胜利 -1表示失败 0表示平局
func(局面){
	   tag = -1;
		for(所有可能要走的情况){
			试走 -> 新局面 s;
			t = func(s); 
			if(t == -1) return 1;
			if(t == 0) tag = 0;
		}
		return tag;
}

流程分析如下:
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
实现代码如下:

package com.rjxy.test;

public class _TicTacToe {
	
	//判断是否赢下的方法
	public static int judge(int[][] arr) {
		{
			if(arr[0][0] == arr[1][1] && arr[1][1] == arr[2][2] && arr[0][0] == arr[2][2]) {
				return 1;
			}
			if(arr[0][2] == arr[1][1] && arr[1][1] == arr[0][2] && arr[3][0] == arr[0][2]) {
				return 1;
			}
			for(int i=0;i<arr.length;i++) {
				if(arr[i][0] == arr[i][1] && arr[i][0] == arr[i][2] && arr[i][1] == arr[i][2]) {
					return 1;
				}
				if(arr[0][i] == arr[1][i] && arr[0][i] == arr[2][i] && arr[1][i] == arr[2][i]) {
					return 1;
				}
			}
		}
		
		return 0;
	}
	
	public static int func(int[][] arr,boolean b) {
		int tag = -1; 
//		int t ;
		boolean key = b;
		//遍历每种要走的局面
		for(int i = 0; i<3; i++) {
			for(int j = 0; j<3; j++) {
				//试走之前看看能不能走 发现不能就结束本次递归调用 返回信息
				{
					if(arr[0][0] == arr[1][1] && arr[1][1] == arr[2][2] && arr[0][0] == arr[2][2]  && arr[0][0]!=0) {
						return -1;
					}
					if(arr[0][2] == arr[1][1] && arr[1][1] == arr[0][2] && arr[2][0] == arr[0][2]  && arr[0][2]!=0) {
						return -1;
					}
					for(int m=0;m<arr.length;m++) {
						if(arr[m][0] == arr[m][1] && arr[m][0] == arr[m][2] && arr[m][1] == arr[m][2] && arr[m][0]!=0) {
							return -1;
						}
						if(arr[0][m] == arr[1][m] && arr[0][m] == arr[2][m] && arr[1][m] == arr[2][m]  && arr[0][m]!=0) {
							return -1;
						}
					}
				}
				
//				int t;
				//如果为能走 也就是第一个 if 则返回 1
				if(arr[i][j] == 0) {
					
					//试走 根据走的不同传递不同的值及局面 而后根据返回结果判断
					if(!key) {
						arr[i][j] = 1;
						int t = func(arr,!key);
//						key = true;
						
						arr[i][j] = 0;
						if(t == -1) {
//							System.out.println("走"+i+j);
							return 1;
							}
						if(t == 0) tag = 0;
					}else {
						arr[i][j] = 2;
						
						
						int t = func(arr,!key);
//						key = false;
						
						arr[i][j] = 0;
						if(t == -1) {
//							System.out.println("走"+i+j);
							return 1;
							}
						if(t == 0) tag = 0;
					}
						
//					tag = func(arr,key);
					
					
					
					
						
				}else if(i == 2 && j ==2 && arr[i][j] != 0 && arr[j][j] != 0){
					if(tag == -1 && judge_0(arr) || tag == 0 ) {
						//数组没有零返回true
//						System.out.println("走"+i+j);
						return 0;
						
					}else if(tag == -1 && !judge_0(arr)) {
						return -1;
					}else 
						return -1;
				
				}else {
					continue;
				}
//				if(tag == -1) {
//					//System.out.println("走"+i+j);
//					return 1;
//					}
//				if(tag == 0) tag = 0;
			}
		}

		return tag;
	}
	
	public static boolean judge_0(int[][] arr) {
		// TODO Auto-generated method stub
		for(int i=0;i<3;i++) {
			for(int j=0;j<3;j++) {
				if(arr[i][j]==0) {
					return false;
				}
			}
		}
		return true;
	}

	public static void main(String[] args) {
		int[][] situation0 = new int[][]{{1,2,0},{0,1,0},{0,0,2}};
		int[][] situation1 = new int[][]{{1,1,2},{0,2,0},{1,0,0}};
		int[][] situation2 = new int[][]{{1,0,2},{0,0,0},{2,1,2}};
		int[][] situation3 = new int[][]{{1,0,1},{2,1,0},{0,0,2}};
		int[][] situation4 = new int[][]{{1,2,0},{0,0,0},{0,0,0}};
//		System.out.println(situation.length);
		System.out.println(func(situation0,false)); //在情况1下,X是必赢的
//		System.out.println();
		System.out.println(func(situation1,true)); //在情况2下,O顶多走平
//		System.out.println();
		System.out.println(func(situation2,false));//在情况3下,O是必赢的 X必输
//		System.out.println();
		System.out.println(func(situation3,true)); //在情况4下,O必输
//		System.out.println();
		System.out.println(func(situation4,false)); //在情况5下 (1,0)是必胜的招
	}
}

运行结果:

在这里插入图片描述

发布了73 篇原创文章 · 获赞 91 · 访问量 4万+

猜你喜欢

转载自blog.csdn.net/weixin_42512488/article/details/88383120