题目链接:https://www.luogu.com.cn/problem/P1189
dfs+剪枝勉强AC
import java.util.Scanner;
public class Main {
static int[][] map=new int[55][55];
static int[][] a=new int[55][55];
static int[][][] bool=new int[55][55][1005]; //剪枝
static int[] v=new int[1005];
static int n,m,x,y,l;
public static void dfs(int nx,int ny,int nz) {
bool[nx][ny][nz]=1;
if(nz>l) {
a[nx][ny]=1;
return;
}
for(int j=1;j<Math.max(n, m);j++) {
boolean b=true;
if(v[nz]==0) { //上
if(nx-j>=1 && map[nx-j][ny]==0 && bool[nx-j][ny][nz+1]==0) {
for(int k=nx-j;k<nx;k++) {
if(map[k][ny]==-1) b=false;
}
if(b) dfs(nx-j,ny,nz+1);
}
}
if(v[nz]==1) { //下
if(nx+j<=n && map[nx+j][ny]==0 && bool[nx+j][ny][nz+1]==0) {
for(int k=nx+1;k<=nx+j;k++) {
if(map[k][ny]==-1) b=false;
}
if(b) dfs(nx+j,ny,nz+1);
}
}
if(v[nz]==2) { //左
if(ny-j>=1 && map[nx][ny-j]==0 && bool[nx][ny-j][nz+1]==0) {
for(int k=ny-j;k<ny;k++) {
if(map[nx][k]==-1) b=false;
}
if(b) dfs(nx,ny-j,nz+1);
}
}
if(v[nz]==3) { //右
if(ny+j<=m && map[nx][ny+j]==0 && bool[nx][ny+j][nz+1]==0) {
for(int k=ny+1;k<=ny+j;k++) {
if(map[nx][k]==-1) b=false;
}
if(b) dfs(nx,ny+j,nz+1);
}
}
}
}
public static void main(String[] args) {
Scanner in=new Scanner(System.in);
n=in.nextInt();
m=in.nextInt();
for(int i=1;i<=n;i++) {
String s=in.next();
for(int j=1;j<=m;j++) {
if(s.charAt(j-1)=='.') map[i][j]=0;
if(s.charAt(j-1)=='X') map[i][j]=-1;
if(s.charAt(j-1)=='*') {
x=i;
y=j;
map[i][j]=0;
}
}
}
l=in.nextInt();
for(int i=1;i<=l;i++) {
String s=in.next();
if(s.equals("NORTH")) v[i]=0;
if(s.equals("SOUTH")) v[i]=1;
if(s.equals("WEST")) v[i]=2;
if(s.equals("EAST")) v[i]=3;
}
in.close();
dfs(x,y,1);
for(int i=1;i<=n;i++) {
for(int j=1;j<=m;j++) {
if(a[i][j]==1) {
System.out.print("*");
}else {
if(map[i][j]==0) {
System.out.print(".");
}else {
System.out.print("X");
}
}
}
System.out.println();
}
}
}