牛客寒假算法基础集训营4 Applese 走迷宫(bfs)
Applese 走迷宫
链接:https://ac.nowcoder.com/acm/contest/330/C
题目描述
在这个游戏中,它被困在了一个 n×mn×m 的迷宫中,它想要逃出这个迷宫。
在迷宫中,有一些方格是水池,只有当 Applese 处于水属性的时候才可以通过;有一些方格是岩浆,只有当 Applese 是火属性的时候可以通过;有一些方格是墙壁,无论如何都无法通过;另一些格子是空地(包括起点和终点),可以自由通过。
在一些空地上有神秘道具可以让 Applese 转换自己的属性(从水属性变为火属性或从火属性变为水属性,需要一个单位的时间)。
输入描述:
第一行两个正整数 n, m 表示迷宫的大小。
接下来 n 行,每行长度为 m 的字符串。描述地图。
其中 'S' 表示起点,'T' 表示终点,'.' 表示空地,'w'表示岩浆,'~'表示水池,'@' 表示道具,'#'表示障碍。
保证地图中的起点和终点只有一个,道具都位于空地。
输出描述:
输出一个整数,表示 Applese 走出迷宫的最短时间。特别地,如果 Applese 走不出迷宫,输出 "-1"。
示例1
输入
5 5 .w@.. .S#.. ~w#.. .w..~ @w.~T
输出
18
备注:
1≤n,m≤100
正解:
1 import java.util.ArrayDeque; 2 import java.util.Scanner; 3 4 class node{ 5 int sta; 6 int x; 7 int y; 8 int step; 9 } 10 public class Main { 11 static final int maxn = 105; 12 static int [][][] vis = new int[2][105][105]; 13 static char [][] mp = new char [105][105]; 14 static String [] s = new String [105]; 15 static int [][] dir = {{0,1},{1,0},{-1,0},{0,-1}}; 16 static ArrayDeque<node> q = new ArrayDeque<node>(); 17 static int n,m; 18 static node head,tail; 19 static void bfs() { 20 while(!q.isEmpty()) { 21 head = new node(); 22 head = q.poll(); 23 if(mp[head.x][head.y]=='T') { 24 System.out.println(head.step); 25 return; 26 } 27 for(int i=0;i<4;i++) { 28 int tx = head.x+dir[i][0]; 29 int ty = head.y+dir[i][1]; 30 int tsta = head.sta; 31 int step = head.step + 1; 32 if(tx<0||tx>=n||ty<0||ty>=m||vis[tsta][tx][ty]==1||mp[tx][ty]=='#') 33 continue; 34 if(tsta==0&&mp[tx][ty]=='w') 35 continue; 36 if(tsta==1&&mp[tx][ty]=='~') 37 continue; 38 vis[tsta][tx][ty] = 1; 39 tail = new node(); 40 tail.x = tx; 41 tail.y = ty; 42 tail.sta = tsta; 43 tail.step = step; 44 q.offer(tail); 45 } 46 if(mp[head.x][head.y]=='@') { 47 if(vis[head.sta^1][head.x][head.y]==1) 48 continue; 49 vis[head.sta^1][head.x][head.y]=1; 50 tail = new node(); 51 tail.x = head.x; 52 tail.y = head.y; 53 tail.step = head.step + 1; 54 tail.sta = head.sta^1; 55 q.offer(tail); 56 } 57 } 58 System.out.println("-1"); 59 } 60 public static void main(String[] args) { 61 Scanner cin = new Scanner(System.in); 62 n = cin.nextInt(); 63 m = cin.nextInt(); 64 for(int i=0;i<n;i++) 65 s[i] = cin.next(); 66 for(int i=0;i<n;i++) { 67 for(int j=0;j<m;j++) { 68 mp[i][j] = s[i].charAt(j); 69 if(mp[i][j] == 'S') { 70 head = new node(); 71 head.sta = 0; 72 head.x = i; 73 head.y = j; 74 head.step = 0; 75 vis[head.sta][head.x][head.y] = 1; 76 q.offer(head); 77 } 78 } 79 } 80 bfs(); 81 } 82 }
下面写法不知道为什么错。。。
1 import java.util.ArrayDeque; 2 import java.util.Scanner; 3 4 class node{ 5 int sta; 6 int x; 7 int y; 8 int step; 9 } 10 public class Main { 11 static final int maxn = 105; 12 static int [][][] vis = new int[2][105][105]; 13 static char [][] mp = new char [105][105]; 14 static String [] s = new String [105]; 15 static int [][] dir = {{0,1},{1,0},{-1,0},{0,-1}}; 16 static ArrayDeque<node> q = new ArrayDeque<node>(); 17 static int n,m; 18 static node head,tail; 19 static void bfs() { 20 while(!q.isEmpty()) { 21 head = new node(); 22 head = q.poll(); 23 if(mp[head.x][head.y]=='T') { 24 System.out.println(head.step); 25 return; 26 } 27 for(int i=0;i<4;i++) { 28 int tx = head.x+dir[i][0]; 29 int ty = head.y+dir[i][1]; 30 int tsta = head.sta; 31 int step = head.step + 1; 32 if(tx<0||tx>=n||ty<0||ty>=m||vis[tsta][tx][ty]==1||mp[tx][ty]=='#') 33 continue; 34 if(tsta==0&&mp[tx][ty]=='w') 35 continue; 36 if(tsta==1&&mp[tx][ty]=='~') 37 continue; 38 if(mp[tx][ty]=='@') { 39 if(vis[head.sta^1][tx][ty]==0) { 40 vis[head.sta^1][tx][ty]=1; 41 tail = new node(); 42 tail.x = tx; 43 tail.y = ty; 44 tail.step = head.step + 2; 45 tail.sta = head.sta^1; 46 q.offer(tail); 47 } 48 49 vis[head.sta][tx][ty]=1; 50 tail = new node(); 51 tail.x = tx; 52 tail.y = ty; 53 tail.step = head.step + 1; 54 tail.sta = head.sta; 55 q.offer(tail); 56 } 57 else { 58 vis[tsta][tx][ty] = 1; 59 tail = new node(); 60 tail.x = tx; 61 tail.y = ty; 62 tail.sta = tsta; 63 tail.step = step; 64 q.offer(tail); 65 } 66 } 67 } 68 System.out.println("-1"); 69 } 70 public static void main(String[] args) { 71 Scanner cin = new Scanner(System.in); 72 n = cin.nextInt(); 73 m = cin.nextInt(); 74 for(int i=0;i<n;i++) 75 s[i] = cin.next(); 76 for(int i=0;i<n;i++) { 77 for(int j=0;j<m;j++) { 78 mp[i][j] = s[i].charAt(j); 79 if(mp[i][j] == 'S') { 80 head = new node(); 81 head.sta = 0; 82 head.x = i; 83 head.y = j; 84 head.step = 0; 85 vis[head.sta][head.x][head.y] = 1; 86 q.offer(head); 87 } 88 } 89 } 90 bfs(); 91 } 92 }