//对一个字符串序列 或 整数数组 排列,求所有排列结果 排列总数//以字符串为例
public class Main2{
static List<String> res;
static boolean[] visited;
public static void main(String[] args){
Scanner in=newScanner(System.in);
String str=in.next();findAll(str);for(int i=0;i<res.size();i++){
System.out.println(res.get(i));}}
public static void findRes(String str,int index,StringBuilder sb){if(index==str.length()){
res.add(sb.toString());return;}for(int i=0;i<str.length();i++){if(!visited[i]){
sb.append(str.charAt(i));
visited[i]=true;findRes(str,index+1,sb);
sb.deleteCharAt(sb.length()-1);
visited[i]=false;}}return;}
public static void findAll(String str){
res=newArrayList<>();
visited=newboolean[str.length()];findRes(str,0,newStringBuilder());}}
组合问题 c(n,k)
//组合问题 c(n,k),n个数中选k个数,有多少种组合,
public class Main3{
static List<String> res;
public static void main(String[] args){
Scanner in=newScanner(System.in);
int n=in.nextInt();
int k=in.nextInt();findAll(n,k);for(int i=0;i<res.size();i++){
System.out.println(res.get(i));}}
public static void findAll(int n, int k,int start,StringBuilder sb){if(sb.length()==k){
res.add(sb.toString());return;}for(int i=start;i<=n-k+1;i++){
sb.append(i);findAll(n,k,i+1,sb);
sb.deleteCharAt(sb.length()-1);}return;}
public static void findAll(int n,int k){
res=newArrayList<>();findAll(n,k,0,newStringBuilder());}}
二维递归
在矩阵中,寻找 给定字符串是否存在
import java.util.Scanner;//在矩阵中,寻找 给定字符串是否存在
public class Main1{
static int[][] dre={{-1,0},{0,1},{1,0},{0,-1}};
static boolean[][] visited;
public static void main(String[] args){
Scanner in=newScanner(System.in);
int n=in.nextInt();
int m=in.nextInt();
char[][] chars=newchar[n][m];for(int i=0;i<chars.length;i++){for(int j=0;j<chars[0].length;j++){
chars[i][j]=in.next().charAt(0);}}
String word=in.next();
System.out.println(exit(chars,word));}
public static boolean inRight(int x,int y,int m,int n){return x>=0&& x<m && y>=0&& y<n;}
public static boolean serch(char[][] chars,String word,int index,int x,int y){if(index==word.length()-1){return chars[x][y]==word.charAt(index);}if(chars[x][y]==word.charAt(index)){
visited[x][y]=true;for(int i=0;i<4;i++){
int newx=x+dre[i][0];
int newy=y+dre[i][1];if(inRight(newx,newy,chars.length,chars[0].length)&&!visited[newx][newy]&&serch(chars,word,index+1,newx,newy)){returntrue;}}}returnfalse;}
public static boolean exit(char[][] chars,String word){if(chars.length<=0|| chars[0].length<=0|| word.length()<=0){returnfalse;}
visited=newboolean[chars.length][chars[0].length];for(int i=0;i<chars.length;i++){for(int j=0;j<chars[0].length;j++){if(serch(chars,word,0,i,j)){returntrue;}}}returnfalse;}}
二维数组 ,找出连续递减的路径 返回最长的路径长度
//在矩阵中,二维数组 ,找出连续递减的路径 返回最长的路径长度
public class Main2{
static int[][] dre={{-1,0},{0,1},{1,0},{0,-1}};
static boolean[][] visited;
public static void main(String[] args){
Scanner in=newScanner(System.in);
int n=in.nextInt();
int m=in.nextInt();
int[][] arr=newint[n][m];for(int i=0;i<arr.length;i++){for(int j=0;j<arr[0].length;j++){
arr[i][j]=in.nextInt();}}
System.out.println(findMaxPath(arr));}
public static boolean inRight(int x,int y,int m,int n){return x>=0&& x<m && y>=0&& y<n;}
public static int serch(int[][] arr, int x,int y,boolean[][] visited,int len){
visited[x][y]=true;for(int i=0;i<4;i++){
int newx=x+dre[i][0];
int newy=y+dre[i][1];if(inRight(newx,newy,arr.length,arr[0].length)&&!visited[newx][newy]){if(arr[newx][newy]<arr[x][y]){
len=Math.max(len,serch(arr,newx,newy,visited,len+1));}}}return len;}
public static int findMaxPath(int[][] arr){if(arr.length<=0|| arr[0].length<=0){return0;}
visited=newboolean[arr.length][arr[0].length];
int maxres=0;for(int i=0;i<arr.length;i++){for(int j=0;j<arr[0].length;j++){
int max=serch(arr,i,j,visited,1);
maxres=Math.max(maxres,max);}}return maxres;}}