图的深度搜索和回溯

    题:输入如下所示 每一个“ . ” 都是可以通行的,而每一个“ # ”表示不能通行,现在要从左下角走遍所有位置,走到右下角。请问有多少种走法

输入: 有多组数据 以0 0表示结束. 第一行表示有n行,m列。接下来n行,m列输入图的案例

2 2
..
..
2 3
#..
...
3 4
....
....
....
0 0
输出:一行表示走法数
1
1
4

java编程实现

import java.util.Scanner;

public class Main {
	private static int count=0;
	public static void main(String[] args) { 
            Scanner in =new Scanner(System.in);
            int n=-1,m=-1;
            while(true)
            {
            	String strs[]=in.nextLine().split(" ");
            	n=Integer.valueOf(strs[0]);
            	m=Integer.valueOf(strs[1]);
            	
            	char [][]a =new char[n][m];
            	int [][] mark=new int[n][m];
            	for(int i=0;i<n;i++)
            	{
            		char []temp=in.nextLine().toCharArray();
                	for(int j=0;j<m;j++)
                	{
                		a[i]=temp;
                	}
            	}
               //开始深度搜索
                count=0;
            	if(n==0&&m==0)
            		break;
               deepSearch(a,mark,n-1,0,n,m);
               System.out.println(count);
            }
	}
	public static void deepSearch(char [][] a, int [][] mark,int sx,int sy,int n,int m)
	{
		//如果超过边界则回退
		if(sx<0||sy<0||sx>=n||sy>=m)
			return ;
		//如果遇到柱子则回退
		if(a[sx][sy]=='#')
			return ;
		//如果此节点已经被访问过则返回
		if(mark[sx][sy]==1)
			return ;
		else
			mark[sx][sy]=1;

		//定义一四个方向 如果此节点可以继续朝下访问 则朝四个方向分别访问
		deepSearch(a,mark,sx-1,sy,n,m);
		deepSearch(a,mark,sx,sy+1,n,m);
		deepSearch(a,mark,sx+1,sy,n,m);
		deepSearch(a,mark,sx,sy-1,n,m);
		
		//如果4个方向访问完了,不能再往下走则判定是否到达终点
		//如果到达输出位置
		if(sx==(n-1)&&sy==(m-1))
		{
			if(over(a,mark,n,m))  //如果所有人都传阅了 则记做一种方法
				{
				  count+=1;
				}
		}
		
		mark[sx][sy]=0; //回溯
	}
	
	public static boolean over(char [][] a,int [][]mark,int n,int m)
	{
		int sum=0;
		for(int i=0;i<n;i++)
			for(int j=0;j<m;j++)
			{
			   sum+=mark[i][j];
			   if(a[i][j]=='#') //如果访问的是#则依然要+1;
				   sum+=1;
			}
		if(sum==(n*m))
		return true;
	
	    return false;
	}
}


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值