题:输入如下所示 每一个“ . ” 都是可以通行的,而每一个“ # ”表示不能通行,现在要从左下角走遍所有位置,走到右下角。请问有多少种走法
输入: 有多组数据 以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;
}
}