密室逃脱18 迷宫题
将上图顺时针旋转90°
每个晶体都可以上下左右四个方向旋转发射能量,要求遍历每个晶体并且最后将能量射进镜子里面。
DFS解决,从起点开始深搜,每个点都从4个方向进行探索(但每个方向都只能探索最多一个晶体),结束条件为穿过最后一个晶体并且已经遍历过的晶体总数等于20
import java.util.Scanner; public class Main{ static char arr[][]=new char[6][8]; static int book[][]=new int[6][8]; static int trail[][]=new int[6][8]; static int flag=0; static void solve(int i,int j,int step){ trail[i][j]=step; if(i==5 && j==6){ if(step==20){ flag=1; return; } return; } for(int rank=j+1;rank<=7;rank++){ //右 if(arr[i][rank]=='1'){ if(book[i][rank]==1){ break; } book[i][rank]=1; solve(i,rank,step+1); if(flag==1){ return; } book[i][rank]=0; trail[i][rank]=0; break; } } for(int row=i+1;row<=5;row++){ //下 if(arr[row][j]=='1'){ if(book[row][j]==1){ break; } book[row][j]=1; solve(row,j,step+1); if(flag==1){ return; } book[row][j]=0; trail[row][j]=0; break; } } for(int rank=j-1;rank>=0;rank--){ //左 if(arr[i][rank]=='1'){ if(book[i][rank]==1){ break; } book[i][rank]=1; solve(i,rank,step+1); if(flag==1){ return; } book[i][rank]=0; trail[i][rank]=0; break; } } for(int row=i-1;row>=0;row--){ //上 if(arr[row][j]=='1'){ if(book[row][j]==1){ break; } book[row][j]=1; solve(row,j,step+1); if(flag==1){ return; } book[row][j]=0; trail[row][j]=0; break; } } } public static void main(String[] args) { Scanner reader=new Scanner(System.in); for(int i=0;i<6;i++){ String str=reader.nextLine(); arr[i]=str.toCharArray(); } book[0][2]=1; solve(0,2,1); for(int i=0;i<6;i++){ for(int j=0;j<8;j++){ System.out.print(trail[i][j]+" "); } System.out.println(); } System.out.println(flag); } }
输入样例:
00101101
01010010
00010001
10101010
00000110
11010110