Introduction
有一个m*n正整数矩阵(0-9),输入一个字符串,字符串由0-9的数字组成,要求判断是否存在从矩阵中的一点出发,可以从顺序相邻的数字构成该字符串。相同的数字单元只能使用一次
Input
第一行输入两个数字分别是m,n, 1<=m,n<=10
第二行按行输出数字矩阵中的数字,用空格隔开
第三行输入字符串(末尾没有换行)
Output
若可以找到输出”true”,若不能找到输出一个”false”
Sample
input
5 5 3 8 2 4 5 7 5 1 3 0 6 5 8 2 4 8 6 5 2 8 2 5 9 6 4 4318568
output
true
Solution
import java.util.Scanner; public class Main { static int[][] arr; static boolean flag=false; static String mate; static boolean[][] vis; static int n,m; static int[] X={1,0,-1,0},Y={0,1,0,-1}; public static void main(String[] args) { Scanner s=new Scanner(System.in); n=s.nextInt(); m=s.nextInt(); arr=new int[n][m]; vis=new boolean[n][m]; for(int i=0;i<n;i++){ for(int j=0;j<m;j++){ arr[i][j]=s.nextInt(); } } mate=s.next(); int begin=mate.charAt(0)-'0'; for(int i=0;i<n;i++){ for(int j=0;j<m;j++){ dfs(0,i,j); } } System.out.println(flag); } static void dfs(int len,int x,int y){ if(len==mate.length()){ flag=true; return; } if(flag||x<0||x>=n||y<0||y>=m||vis[x][y]||arr[x][y]!=(mate.charAt(len)-'0'))return; for(int i=0;i<4;i++){ vis[x][y]=true; dfs(len+1,x+X[i],y+Y[i]); vis[x][y]=false; } } }
Experience
正常的dfs