当前位置:   article > 正文

蓝桥杯国赛|平局博弈_博弈平局时应该

博弈平局时应该

平局博弈

  1. 模拟博弈过程
  2. 当我们选择一个*为,填入L或O时。
    递归函数发f(),对于当前调用该函数的人来说,是做最优决策的。
    例如,当试探到一种输的局面时,它依旧会去试探对于当前调用者平局或者胜利的局面。
    当试探到平局的局面,它依旧会去试探是否存在胜利的局面。
    当试探到胜利的局面时,直接返回胜利即可。

未优化,只能过20%数据

import java.util.Scanner;

public class 填字母游戏 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner sc = new Scanner(System.in);
		int n = sc.nextInt();
		sc.nextLine();
		while (n-- != 0) {
			char[] chs = sc.nextLine().toCharArray();
			int ans = dfs(chs);
			System.out.println(ans);
		}
	}

	private static int dfs(char[] chs) {
		String s = new String(chs);
		if (s.contains("LOL"))
			return -1;
		if (!s.contains("*"))
			return 0;

		int ans = -1;
		int ping = -1;
		for (int i = 0; i < s.length(); i++) {// 选择落子的位置
			if (chs[i] == '*') {
				// 试填L
				chs[i] = 'L';
				int temp = dfs(chs);
				if (temp == -1) {
					chs[i] = '*';
					return 1;
				} else if (temp == 0)
					ping = 1;
				else
					ans = -1;
				
				// 试填O
				chs[i] = 'O';
				temp = dfs(chs);
				if (temp == -1) {
					chs[i] = '*';
					return 1;
				} else if (temp == 0)
					ping = 1;
				else
					ans = -1;
				chs[i] = '*';
			}
		}

		if (ping == 1)
			return 0;
		return ans;
	}

}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58

记忆化DFS

import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;

public class 填字母游戏 {

	static Map<String, Integer> map = new HashMap<String, Integer>();

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner sc = new Scanner(System.in);
		int n = sc.nextInt();
		sc.nextLine();
		while (n-- != 0) {
			char[] chs = sc.nextLine().toCharArray();
			int ans = dfs(chs);
			System.out.println(ans);
		}
	}

	private static int dfs(char[] chs) {
		String s = toS(chs);
		if (map.containsKey(s))
			return map.get(s);

		if (s.contains("LOL"))
			return -1;
		if (!s.contains("*"))
			return 0;

		int ans = -1;
		int ping = -1;
		for (int i = 0; i < s.length(); i++) {// 选择落子的位置
			if (chs[i] == '*') {
				// 试填L
				chs[i] = 'L';
				int temp = dfs(chs);
				map.put(toS(chs), temp);
				if (temp == -1) {
					chs[i] = '*';
					return 1;
				} else if (temp == 0)
					ping = 1;
				else
					ans = -1;

				// 试填O
				chs[i] = 'O';
				temp = dfs(chs);
				map.put(toS(chs), temp);
				if (temp == -1) {
					chs[i] = '*';
					return 1;
				} else if (temp == 0)
					ping = 1;
				else
					ans = -1;
				chs[i] = '*';
			}
		}

		if (ping == 1) {
			map.put(s, 0);
			return 0;
		}
		map.put(s, ans);
		return ans;
	}

	private static String toS(char[] chs) {
		StringBuilder sb = new StringBuilder();
		for (int i = 0; i < chs.length; i++) {
			sb.append(chs[i]);
		}
		return sb.toString();
	}

}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小惠珠哦/article/detail/917587
推荐阅读
相关标签
  

闽ICP备14008679号