单组输入。 第1行输入两个正整数N和K,表示迷宫的大小和逃脱陷阱需要额外增加的时间。(N<=100,K<=100) 接下来N行表示迷宫,X星人的起点是左上角,终点是右下角。
输出X星人从起点到终点最少需要的时间(单位:秒)。如果不能从起点到达终点则输出“No solution”。
3 2 0#0 0#1 000
4
#include <functional> #include <iostream> #include <queue> #include <vector> #include<climits> using namespace std; // 构建小根堆 struct Node { int cost; int i; int j; bool operator<(const Node& other) const{ return cost > other.cost; } }; int main() { int n, k; cin >> n >> k; vector<vector<char>> grid(n, vector<char>(n)); for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { cin >> grid[i][j]; } } vector<vector<int>> dirs = {{-1, 0}, {1, 0}, {0, 1}, {0, -1}}; vector<vector<int>> visited(n, vector<int>(n, INT_MAX)); visited[0][0] = 0; if (grid[n - 1][n - 1] == '1') { cout << "No solution\n"; return 0; } priority_queue<Node> pq; pq.push({0, 0, 0}); while (!pq.empty()) { auto [cost, i, j] = pq.top(); pq.pop(); if (cost > visited[i][j]) { continue; } for (auto dir : dirs) { int di = i + dir[0]; int dj = j + dir[1]; if (di < 0 || dj < 0 || di >= n || dj >= n || grid[di][dj] == '1') { continue; } int newCost = cost + 1; if (grid[di][dj] == '#') { newCost += k; } if (visited[di][dj] > newCost) { pq.push({newCost, di, dj}); visited[di][dj] = newCost; } } } if (visited[n - 1][n - 1] == INT_MAX) { cout << "No solution\n"; } else { cout << visited[n - 1][n - 1] << endl; } return 0; } // 64 位输出请用 printf("%lld")
import java.util.Scanner; import java.util.Arrays; // 注意类名必须为 Main, 不要有任何 package xxx 信息 public class Main { static int res = Integer.MAX_VALUE; public static void main(String[] args) { Scanner scanner = new Scanner(System.in); // 迷宫大小 int N = scanner.nextInt(); // 逃脱陷阱额外时间 int K = scanner.nextInt(); // 地图 int graph[][] = new int[N][N]; // 当前点是否可达 boolean visited[][] = new boolean[N][N]; for(int i=0;i<N;i++){ char[] arr = scanner.next().toCharArray(); for(int j=0;j<N;j++){ // 此时是起点 if(i==0&&j==0){ visited[i][j] = true; continue; }else if(arr[j]=='#'){ graph[i][j] = K+1; visited[i][j] = true; }else if(arr[j]=='0'){ visited[i][j] = true; graph[i][j] = 1; } } } DFS(graph,visited,0,0,N,0); if(res!=Integer.MAX_VALUE){ System.out.println(res); }else{ System.out.println("No solution"); } } private static void DFS(int dp[][],boolean visited[][],int i,int j,int n,int sum){ if(i==n-1&&j==n-1&&visited[i][j]){ int temp = sum + dp[i][j]; if(temp<res){ res = temp; } return; } if(i-1>=0 && visited[i-1][j]){ visited[i][j] = false; DFS(dp,visited,i-1,j,n,sum+dp[i][j]); visited[i][j] = true; } if(i+1<n && visited[i+1][j]){ visited[i][j] = false; DFS(dp,visited,i+1,j,n,sum+dp[i][j]); visited[i][j] = true; } if(j-1>=0 && visited[i][j-1]){ visited[i][j] = false; DFS(dp,visited,i,j-1,n,sum+dp[i][j]); visited[i][j] = true; } if(j+1<n && visited[i][j+1]){ visited[i][j] = false; DFS(dp,visited,i,j+1,n,sum+dp[i][j]); visited[i][j] = true; } } }