走路径类型
走方格
这道题dfs会超时,仅作参考。
本题求路径总数,且起点固定1,1,终点固定n,m
设置vis数组判断这个格子是否走过,避免重复走。
dfs(1,1)表示从1,1出发,因此需要把这个格子标记为true。
import java.io.*;
import java.util.*;
public class eighth {
static int N=35;
static int M=35;
static int count=0;
static int n,m;
static int a[][]=new int[N][M];
static int f[][]=new int[N][M];
static boolean isVisited[][]=new boolean[N][M];
static int dx[]= {0,1};
static int dy[]= {1,0};
public static void dfs(int x,int y) {
if(x==n && y==m) {
count++;
return;
}
for(int i=0;i<2;i++) {
int xx=x+dx[i];
int yy=y+dy[i];
if(xx<1 ||yy<1 || xx>n || yy>m) continue;//边界错了
if(xx%2==0 && yy%2==0) continue;
if(isVisited[xx][yy]) continue;
isVisited[xx][yy]=true;
dfs(xx,yy);
isVisited[xx][yy]=false;
}
}
public static void main(String args[]) {
Scanner sc=new Scanner(System.in);
n=sc.nextInt();
m=sc.nextInt();
isVisited[1][1]=true;//这里忘记标记
dfs(1,1);
dp();
System.out.println(count+" "+f[n][m]);
}
}
摆花P1970
这道题可使用贪心,这里叙述暴力搜索逻辑(会超时):
枚举所有方案(每株花有选与不选的可能),最后check是否合法,O(2^n)的做法。