怪盗基德1413 2025-02-23 13:57 采纳率: 100%
浏览 9
已结题

怎么修改这段代码好呢?

案例只对了两个。不知道怎么修改好?
链接
已经打出来的代码。

#include <bits/stdc++.h>
using namespace std;
char a[50][50];
//存储输入的矩阵。
int d[50][50],n,m,xx,yy;
//d数组保存到达每一个点的最少是时间
void o(char c){
    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++){
            if(a[i][j]==c){
                xx=i;
                yy=j;
                return ;
            }
        }
    }
}
//递推函数,x是行,y是列,num是到那个点的时间。
void dfs(int x,int y,int num){
    if(x<=n&&x>=1&&y<=m&&y>=1&&(((a[x][y]=='@'||a[x][y]=='a')&&d[x][y]>num+1)||(a[x][y]=='x'&&d[x][y]>num+2)||(a[x][y]=='r'&&d[x][y]!=1))){
                //判断如果那个位置是守卫的话,那么就额外加一个时间单位。
        if(a[x][y]=='x'){
            d[x][y]=num+1;
            dfs(x,y+1,num+2);
            dfs(x+1,y,num+2);
            dfs(x,y-1,num+2);
            dfs(x-1,y,num+2);
        }else{
            d[x][y]=num;
            dfs(x,y+1,num+1);
            dfs(x+1,y,num+1);
            dfs(x,y-1,num+1);
            dfs(x-1,y,num+1);
        }
    }
}
int main(){
    int t1,t2,s1,s2;
        //输入行和列
    cin>>n>>m;
        //输入矩阵
    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++){
            cin>>a[i][j];
            d[i][j]=INT_MAX; 
        }
    }
        //查找开始的骑士在哪个位置.
    o('r');
    s1=xx;
    s2=yy;
        //查找公主的位置。
    o('a');
    t1=xx;
    t2=yy;
    dfs(s1,s2,1);
    if(d[t1][t2]==INT_MAX)cout<<"Impossible";
    else cout<<d[t1][t2]-2;
    return 0;
}

请求如何更改?

  • 写回答

2条回答 默认 最新

  • 道友老李 JWE233286一种基于机器视觉的水表指针读数识别及修正的方法 专利发明者 2025-02-23 14:18
    关注
    让【道友老李】来帮你解答,本回答参考gpt编写,并整理提供,如果还有疑问可以点击头像关注私信或评论。
    如果答案让您满意,请采纳、关注,非常感谢!
    在代码中存在错误,主要是因为递推函数中的条件判断有误,需要做出以下修改:
    1. 将条件判断部分的 "d[x][y]!=1" 修改为 "d[x][y]!=1"。
    2. 在判断 "如果那个位置是守卫的话,额外增加一个时间单位" 的逻辑中,需要把当前位置的值置为 'r',即 a[x][y] = 'r'。
    3. 修改递推函数 dfs 中的代码逻辑,确保正确地更新 d 数组值和判断条件。 修改后的代码如下所示:
    #include <bits/stdc++.h>
    using namespace std;
    char a[50][50];
    int d[50][50],n,m,xx,yy;
    void dfs(int x, int y, int num) {
        if (x>=1 && x<=n && y>=1 && y<=m && (a[x][y]=='@' || a[x][y]=='a') && (d[x][y]>num+1 || d[x][y]==0)) {
            if (a[x][y]=='x') {
                a[x][y] = 'r'; // 设为守卫
                d[x][y] = num+1;
                dfs(x,y+1,num+2);
                dfs(x+1,y,num+2);
                dfs(x,y-1,num+2);
                dfs(x-1,y,num+2);
            } else {
                d[x][y] = num;
                dfs(x,y+1,num+1);
                dfs(x+1,y,num+1);
                dfs(x,y-1,num+1);
                dfs(x-1,y,num+1);
            }
        }
    }
    int main() {
        int t1, t2, s1, s2;
        
        // 输入行和列
        cin >> n >> m;
        
        // 输入矩阵
        for (int i = 1; i <= n; i++) {
            for (int j = 1; j <= m; j++) {
                cin >> a[i][j];
                d[i][j] = 0;
            }
        }
        
        // 查找骑士的位置
        for (int i = 1; i <= n; i++) {
            for (int j = 1; j <= m; j++) {
                if (a[i][j] == 'r') {
                    s1 = i;
                    s2 = j;
                }
            }
        }
        
        // 查找公主的位置
        for (int i = 1; i <= n; i++) {
            for (int j = 1; j <= m; j++) {
                if (a[i][j] == 'a') {
                    t1 = i;
                    t2 = j;
                }
            }
        }
        
        dfs(s1, s2, 1);
        
        if (d[t1][t2] == 0) {
            cout << "Impossible";
        } else {
            cout << d[t1][t2]-2;
        }
        
        return 0;
    }
    

    以上修改后的代码应该能够正确运行,并根据骑士的位置('r')和公主的位置('a')计算出最短时间到达公主的步数。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 3月3日
  • 已采纳回答 2月23日
  • 创建了问题 2月23日