单组输入。 第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;
}
}
}