标题: 振兴中华
小明参加了学校的趣味运动会,其中的一个项目是:跳格子。
地上画着一些格子,每个格子里写一个字,如下所示:(也可参见p1.jpg)
从我做起振
我做起振兴
做起振兴中
起振兴中华
我做起振兴
做起振兴中
起振兴中华
比赛时,先站在左上角的写着“从”字的格子里,可以横向或纵向跳到相邻的格子里,但不能跳到对角的格子或其它位置。一直要跳到“华”字结束。
要求跳过的路线刚好构成“从我做起振兴中华”这句话。
请你帮助小明算一算他一共有多少种可能的跳跃路线呢?
这题有规律就不说了,就是a[i][j]=a[i-1][j]+a[i][j-1];
根据题目给出的图来看出,那么我写一个一般的解决方法(不是针对本题的图),就是搜索了呗,这个也很简单,但是我遇到了一个问题就是在比较中文的时候,使用
以前的方法怎么都比较不出来,就是equals和compare方法,后来我查阅到使用一个Collator类才得以解决,其实就是对各种语言进行本地化的一个类吧。上代码
import java.text.Collator;
import java.util.*;
public class Main {
static Scanner in = new Scanner(System.in);
static int n,m,ans,k;
static String com ;
static char[][] maze = new char[100][100];
static char[] res = new char[10];
static String[] ss = new String[1000];
static boolean[][] vis = new boolean[100][100];
static int[][] dir= {{0,1},{1,0},{0,-1},{-1,0}};
//就是这个类,类似还可以比较其他语言
static Collator co = Collator.getInstance(Locale.CHINA);
static void find(int x,int y,int sp) {
if(sp>=8) {
String s = new String(res);
//System.out.println(s+" "+com+" "+co.compare(s, com));
if(co.compare(s, com)==0)
ans++;
return;
}
int tx,ty;
for(int i = 0;i < 4;i++) {
tx = x + dir[i][0];
ty = y + dir[i][1];
if(tx<0||ty<0||tx>=n||ty>=m||vis[tx][ty])
continue;
vis[tx][ty]=true;
res[sp]=maze[tx][ty];
find(tx,ty,sp+1);
vis[tx][ty]=false;
}
}
public static void main(String[] args) {
n = in.nextInt();
m = in.nextInt();
String s ;
com = "从我做起振兴中华";
for(int i = 0;i < n;i++) {
s = in.next();
for(int j = 0;j < s.length();j++) {
vis[i][j]=false;
maze[i][j]=s.charAt(j);
}
}
res[0]='从';
find(0,0,1);
System.out.println(ans);
//System.out.println("从我做起振兴中华".equals("从我做起振兴中华"));
}
}