走方格啊走--初学dfs

 在平面上有一些二维的点阵。

    这些点的编号就像二维数组的编号一样,从上到下依次为第 1 至第 n 行,从左到右依次为第 1 至第 m 列,每一个点可以用行号和列号来表示。

    现在有个人站在第 1 行第 1 列,要走到第 n 行第 m 列。规定每次只能向右或者向下走。

    注意,如果行号和列号都是偶数,则不能走入这一格中。

    问有多少种方案。

【输入形式】

    输入一行包含两个整数 n,m。
【输出形式】

    输出一个整数,表示答案。
【样例输入1】

3 4
【样例输出1】
2

【样例输入2】

6 6
【样例输出2】
0
【评分标准】

    1 ≤ n,m ≤ 30

就按网上教学的,套模板

void dfs(int step,其他参数)
   {
        //先判断边界
        if(满足边界条件){
           //输出?计数? 
        }
        //然后是循环搜索
        for(int i=1;i<方法总数;i++){
            //某个方法可行
            if()
            {//标记一下
                visited=1;
                //继续从这为新起点找其他可行
                dfs(step+1,)
                //当上种情况无法继续拓展或者满足条件输出返回,要进行回溯,将此种情况取消标记,再搜索下一种可行的情况
                visited=0;
        }

看其他大神程序员都是设置一个较大的数组,自定义的迷宫范围内通路点设置值为n1,n1>0;障碍物设置为n2>0,这样可以避免越界?

import java.util.Scanner;

public class T8Maze {
	static Scanner scanner=new Scanner(System.in);
	static int n=scanner.nextInt();
	static int m=scanner.nextInt();
	static int [][]maze=new int [50][50];
	static int [][]maze_alley=new int [50][50];
	static int [][]visited=new int[50][50];
	//定义起点终点xy值
	static int start_x=1;
	static int start_y=1;
	static int final_x=n;
	static int final_y=m;
	static int dx[]= {0,1};
	static int dy[]= {1,0};
	//设置计数变量
	static int count=0;

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		for(int i=1;i<n+1;i++)
		{
			for(int j=1;j<m+1;j++)
			{
				if(i%2==0&&j%2==0)
				{
					maze_alley[i][j]=2;
				}
				else {
					maze_alley[i][j]=1;
				}
			}
		}
		//设置起点为已访问
		visited[start_x][start_y]=1;
		dfsForMaze(0,start_x,start_y);
		System.out.println(count);
		
	}
	public static void dfsForMaze(int step,int x,int y)//在本题中,变量是xy坐标
	{
		if(x==final_x&&y==final_y)//边界条件,如果到达右下角
		{
			count++;
			return;
		}
		//进行搜索
		//向下搜索
		for(int k=0;k<=1;k++)
		{
			int tx,ty;
			tx=x+dx[k];
			ty=y+dy[k];
			//tx ty指示的移动到的下一个坐标
			if(maze_alley[tx][ty]==1&&visited[tx][ty]==0)
			{
				visited[tx][ty]=1;
				dfsForMaze(step+1, tx, ty);
				visited[tx][ty]=0;
			}
			
		}

//		if(visited[x][y+1]==0&&maze_alley[x][y+1]!=2)
//		{
//			//如果未访问且能走,则可
//			visited[x][y+1]=1;
			System.out.println("向下走到"+x+" "+(y+1));
//			dfsForMaze(step+1, x, y+1);
//			visited[x][y+1]=0;
//		}
//		//向右搜索
//		if(isOut(x+1, y)==0)
//		{
//			return;
//		}
//		if(visited[x+1][y]==0&&maze_alley[x+1][y]!=2)
//		{
//			//如果未访问且能走,则可取
//			visited[x+1][y]=1;
			System.out.println("向右走到"+(x+1)+" "+y);
//			dfsForMaze(step+1, x+1, y);
//			visited[x+1][y]=0;
//		}
		return;
		
	}
//	public static int isOut(int x,int y)
//	{
//		if(x>=n+1||y>=m+1)
//		{
//			return 0;
//		}
//		return 1;
//	}

}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值