在平面上有一些二维的点阵。
这些点的编号就像二维数组的编号一样,从上到下依次为第 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;
// }
}