八皇后问题---动态规划

做了好多动态规划的题目,有了一些心得。

	public int getanswer(char[][] map,int index,int n) {
		if(index==n) {// index==n  则意味的递归结束
			/*System.out.println("-------------");
			for(int i=0;i<n;i++) {
				System.out.println(map[i]);
			}//打印一些 可行的排列
			System.out.println("--------------");*/
			return -1;//返回-1 意味着递归的结束,或 递归失败
		}else {
			for(int i=0;i<n;i++) {//遍历该次 皇后可行的位置
				if(isOk(i, index, map)) {
					map[index][i]='Q';
					if(getanswer(map, index+1, n)==-1) {//递归返回1  说明该位置符合
						map[index][i]='\0';
					}
				}
			}
			return -1;//递归失败,返回上一级
		}
	}
	public boolean isOk(int x,int y,char[][] map) {//判断某个点 是否可以安放
		int len=map.length;
		for(int i=y-1,j=1;i>=0;i--) {
			if(map[i][x]!='\0')return false;
			if(x-j>=0&&map[i][x-j]!='\0')return false;
			if(x+j<len&&map[i][x+j]!='\0')return false;
			j++;
		}
		return true;
	}

总的来说,八皇后问题就是在不断的递归求解中,尝试可能的情况,假如下一级递归失败,则尝试一下一种情况

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Java八皇后问题是一个经典的回溯算法问题,它的目标是在一个8x8的棋盘上放置8个皇后,使得它们不互相攻击,即任意两个皇后都不能在同一行、同一列或者同一对角线上。动态规划算法可以通过状态转移方程来实现,具体实现过程可以参考以下步骤: 1. 定义状态:使用一个一维数组 queens 来表示棋盘的放置状态,queens[i] 表示第 i 行皇后所在的列数。 2. 定义状态转移方程:对于第 i 行皇后,它可以放置在 0 ~ 7 中的任意一个位置,因此可以得到状态转移方程 queens[i] = j,其中 j 表示第 i 行皇后所在的列数,同时需要保证该位置不与之前已经放置的皇后冲突,即 queens[i] != queens[k] && abs(queens[i] - queens[k]) != abs(i - k),其中 k 表示已经放置的皇后行数。 3. 初始化:初始化 queens 数组为 -1,表示所有皇后都未放置。 4. 递归回溯:从第一行开始递归回溯,在每一行中遍历所有可能的列数,判断当前位置是否合法,如果合法则继续递归下一行,否则回溯到上一行重新选择位置。 以下是Java八皇后问题动态规划算法实现代码: ``` public class EightQueens { private static final int N = 8; // 皇后数量 private static int[] queens = new int[N]; // 皇后所在列数 public static void main(String[] args) { Arrays.fill(queens, -1); // 初始化为未放置状态 dfs(0); // 从第一行开始递归回溯 } private static void dfs(int row) { if (row == N) { // 所有皇后都已放置完毕,输出结果 System.out.println(Arrays.toString(queens)); return; } for (int col = 0; col < N; col++) { // 枚举当前行所有可能的列数 if (isValid(row, col)) { // 判断当前位置是否合法 queens[row] = col; // 放置皇后 dfs(row + 1); // 递归下一行 queens[row] = -1; // 回溯到上一行重新选择位置 } } } private static boolean isValid(int row, int col) { for (int i = 0; i < row; i++) { if (queens[i] == col || Math.abs(queens[i] - col) == Math.abs(i - row)) { return false; // 判断是否与之前放置的皇后冲突 } } return true; } } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值