zoukankan      html  css  js  c++  java
  • 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]);
    	}
    }
    

      

  • 相关阅读:
    ES6基础知识
    浏览器相关的前端知识
    JavaScript基础知识汇总
    HTML(超文本标记语言)基础知识汇总
    CSS相关基础知识汇总
    NYOJ 737 石子合并(一)
    HDU 1051 Wooden Sticks
    NY 325 zb的生日
    HDU 2068 RPG的错排
    HDU 1284 钱币兑换问题
  • 原文地址:https://www.cnblogs.com/passion-sky/p/8566046.html
Copyright © 2011-2022 走看看