24dfs(java)振兴中华

【题目】

标题: 振兴中华


    小明参加了学校的趣味运动会,其中的一个项目是:跳格子。
    地上画着一些格子,每个格子里写一个字,如下所示:(也可参见p1.jpg)

从我做起振
我做起振兴
做起振兴中
起振兴中华

    比赛时,先站在左上角的写着“从”字的格子里,可以横向或纵向跳到相邻的格子里,但不能跳到对角的格子或其它位置。一直要跳到“华”字结束。

    要求跳过的路线刚好构成“从我做起振兴中华”这句话。

    请你帮助小明算一算他一共有多少种可能的跳跃路线呢?

答案是一个整数,请通过浏览器直接提交该数字。
注意:不要提交解答过程,或其它辅助说明类的内容。

 解法一:神搜

package codeforces;
import java.util.*;

public class Main937B {
	
	
	 static int n=5,m=4;
	static int a[][]=new int[6][6];
	 static int vis[][]=new int[6][6];
	 static int cnt=0;
	 static int dir[][]= {{1,0},{0,1},{-1,0},{0,-1}};
	  public static void main(String[] args){
		  solve();
	  }
	 
	  public static void solve() {
		 Scanner sc=new Scanner(System.in);
		 
		
		for(int i=1;i<=4;i++)
			for(int j=1;j<=5;j++)
			{
				a[i][j]=i+j-1;
				vis[i][j]=0;
			}
		dfs(1,1);
		System.out.println(cnt);
	  }
	  public static void dfs(int row,int col)
	  {
		  vis[row][col]=1;
		  if(a[row][col]==8)cnt++;
		  for(int i=0;i<4;i++)  
		    {  
		        int dx=row+dir[i][0];  
		        int dy=col+dir[i][1];  
		        if(dx<1||dy<1||dx>4||dy>5)continue;  
		        else {
		        	if(vis[dx][dy]==0&&a[dx][dy]-a[row][col]==1)
		        	{
		        		vis[dx][dy]=1;
		        		dfs(dx,dy);
		        		vis[dx][dy]=0;
		        	}
		        }
		    }
	  }
}
		

  解法二:

动态规划:

public class ZhenXingZhongHua {
	public static void main(String[] args) {
		int[][] a = new int[4][5];
		int i;
		int j;
		for (i = 0; i < 4; i++)
			for (j = 0; j < 5; j++) {
				if (i == 0 || j == 0)
					a[i][j] = 1;
			}
		a[0][0] = 0;
		for (i = 1; i < 4; i++) {
			for (j = 1; j < 5; j++)
				a[i][j] = a[i - 1][j] + a[i][j - 1];
		}
		System.out.println(a[3][4]);
	}
}

  解法三:数学(排列组合)

C(7,3)




理由: 首先到达终点必须要走七步,在这七步里一定有四步是横着走,三步竖着走,顺序随。从七步里任选3步横向走,因此有c(7,3)种可能

  变形题:

变型题:

.从20*20的网格的左上角通往右下角有多少条路?  

从一个2*2网格的左上角开始,有6条(不允许往回走)通往右下角的路。

 



对于20*20的网格,这样的路有多少条?

其实就是和上面的比较类似:

个人认为20*20的表格应该是21*21的数据进行解答。

代码如下:


public class ZhenXingZhongHuaBianXing {
	public static void main(String[] args) {
		int[][] a=new int[21][21];
		for (int i = 0; i < a.length; i++) {
			for (int j = 0; j < a[i].length; j++) {
				if(i==0||j==0){
					a[i][j]=1;
				}
			}
		}
		a[0][0]=0;
		for (int i = 1; i < a.length; i++) {
			for (int j = 1; j < a[i].length; j++) {
				a[i][j]=a[i-1][j]+a[i][j-1];
			}
		}
		System.out.println(a[20][20]);
	}
}

  

原文地址:https://www.cnblogs.com/passion-sky/p/8566046.html