LeetCode688:类似576

1、注意结束条件
2、注意步数=0的情况

代码:

package com.leetCode.dp;

public class leet688 {
	/**
	 * 注意走0步的情况
	 * r和c都在原地,走1步的情况
	 * @param args
	 */
	public static void main(String[] args) {
		System.out.println(knightProbability(1,1,0,0));
	}
	static double y=0;
	static double s=0;
	static int m=0;
    public static double knightProbability(int N, int K, int r, int c) {
    	double ans=0.0;
    	if(K==0) return 1.0;
    	int[][][] dp = new int[N][N][K+1];
    	for(int i=0;i<N;i++)
    	{
    		for(int j=0;j<N;j++)
    		{
    			for(int k=0;k<=K;k++)
    			{
    				dp[i][j][k]=-1;
    			}
    		}
    	}
    	find(N,K,r,c,dp);
//    	System.out.println(s+" "+y);
    	s=Math.pow(8, K);
    	ans=y/s;
    	return ans;
    }
	private static void find(int n, int k, int r, int c, int[][][] dp) {
		m++;
		if(k<0)
		{
			s++;
			return ;
		}
		if(r<0||c<0||r>=n||c>=n)
		{
			return ;
		}
		if(r>=0&&c>=0&&r<n&&c<n&&k==0)
		{
			System.out.println(r+" "+c);
			s++;
			y++;
			if(m==1) y--;
			return ;
		}
		if(dp[r][c][k]==-1)
		{
			find(n,k-1,r+1,c+2,dp);
			find(n,k-1,r+1,c-2,dp);
			find(n,k-1,r-1,c+2,dp);
			find(n,k-1,r-1,c-2,dp);
			find(n,k-1,r+2,c+1,dp);
			find(n,k-1,r+2,c-1,dp);
			find(n,k-1,r-2,c+1,dp);
			find(n,k-1,r-2,c-1,dp);
		}
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值