用dfs的方法
题目
马在中国象棋以日字形规则移动。
请编写一段程序,给定 n×m大小的棋盘,以及马的初始位置 (x,y)这里默认为(0,0),要求不能重复经过棋盘上的同一个点,计算马可以有多少途径遍历棋盘上的所有点。
输入格式
第一行为整数 表示测试数据组数。每一组测试数据包含一行,为四个整数,分别为棋盘的大小以及初始位置坐标
输出格式
每组测试数据包含一行,为一个整数,表示马能遍历棋盘的途径总数,0为无法遍历一次
import java.util.Scanner;
public class 马走日 {
static int dx[]={2,1,2,-1,1,-1,-2,-2};
static int dy[]={1,2,-1,2,-2,-2,-1,1};//经过分析,马有8种可能的步数方式
static Scanner scanner=new Scanner(System.in);
static int i=scanner.nextInt();
static int j=scanner.nextInt();
static int map[][]=new int[i][j];
static int ant=0;
public static void main(String[] args) {
for(int i1=0;i1<i;i1++){
for (int i2=0;i2<j;i2++){
map[i1][i2]=0;//初始化未走的位置
}
}
dfs(0,0,0);//这里只以(0,0)为初始位置开始开始
System.out.println(ant);
}
public static void dfs(int i1,int j1,int setps){
if(setps==j*i-1){//当此次steps达到走完全部的格子,就完成一次ant加一
ant++;
}
map[i1][j1]=2;//表示标记已读
for (int a=0;a<8;a++){
int a1=dx[a]+i1;
int b1=dy[a]+j1;//8次位置分别开始
if(0<=a1 && a1<i && 0<=b1 &&b1<j && map[a1][b1]==0){
dfs(a1,b1,setps+1);//满足未读,不出界等条件就进行下一次,步数加一
}
}
map[i1][j1]=0;//当for遍历结束时会回溯并将map【i1】【j1】变为未读的0,不影响下次的计数
}
}
补充,如果需要全部不同初始位置的总结果
for (int i1=0;i1<i;i1++){
for (int j1=0;j1<j;j1++){
dfs(i1,j1,0);//把所有位置初始都来一遍
}
}