Cc-282 2023-03-09 02:53 采纳率: 40%
浏览 94
已结题

关于#C语言 算法#的问题,如何解决?

C语言实现岛屿数量统计系统:修改多次后,运行结果依旧无法显示,知识掌握不足,不知道为什么会出现这种情况,希望能解决(题目要求一定要用dfs和bfs两种算法实现)并且请给出切实可行、在此代码基础之上的修改后的代码,能运行出结果来,谢谢!!!(不要只回答哪哪有,要真的吧问题解决)

img

#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#define MAX_NUM 1000
int visited[MAX_NUM][MAX_NUM]={0};
 
typedef int DataType;    //便于修改数据类型 
//定义队列
typedef struct Queue
{
    DataType data;
    struct Queue* next;
}QNode;
//设置头尾指针
typedef struct PQueue
{
    QNode* head;
    QNode* tail;
}PQ;
//初始化队列
void InitQueue(PQ* pq)
{
    pq->head=NULL;
    pq->tail=NULL;
} 
//删除队列
void DeleQueue(PQ* pq)
{
    QNode* p=pq->head;
    while(p!=NULL)
    {
        QNode* temp=p->next;
        free(p);
        p=temp;
    }
} 
//队列尾部插入
void Push_Queue(PQ* pq,DataType data)     //确保队列已经存在 
{
    assert(pq);
    QNode* temp=(QNode*)malloc(sizeof(QNode));
    temp->data=data;
    if(pq->head==NULL)
    {
        pq->tail=temp;
        pq->head=pq->tail;
    }
    else
    {
        pq->tail->next=temp;
        pq->tail=temp;
    } 
}
//队列头部删除
void Pop_Queue(PQ* pq)          //确保队列已经存在且不为空 
{
    assert(pq);
    QNode* temp=pq->head->next;
    free(pq->head);
    pq->head=temp;
}
//判断是否队空
int EmptyQueue(PQ* pq)
{
    if(pq->head==NULL)
    {
        return 1;
    }
    else
    {
        return 0;
    }
}
//队首
DataType Front_Queue(PQ* pq)
{
    int f=EmptyQueue(pq);
    if(f)
    {
        printf("队列为空!!!\n");
        exit(-1);
    }
    return pq->head->data;
}
//队尾
DataType Rear_Queue(PQ* pq)
{
    int f=EmptyQueue(pq);
    if(f)
    {
        printf("队列为空!!!\n");
        exit(-1);
    }
    return pq->tail->data;
} 
 
 
 
 
//BFS实现 
void BFS(int **map,int row,int col,int x,int y)
{
    PQ q;
    InitQueue(&q);                       //初始化 
    map[row][col]=0;                    //将当前所在位置置0 
    int c=row*10+col;                   //队列中存储一个数字,将两个数字转化为一个存储
    Push_Queue(&q,c);                  //入队
    while(!EmptyQueue(&q))
    {
        c=Front_Queue(&q);
        Pop_Queue(&q);               //出队
        int i=c/10,j=c%10;                
        if(i-1>=0 && map[i-1][j]==1)       //上
        {
            map[i-1][j]=0;
            Push_Queue(&q,(i-1)*10+j);
        }
        if(i+1<=x && map[i+1][j]==1)       //下 
        {
            map[i+1][j]=0;
            Push_Queue(&q,(i+1)*10+j);
        }
        if(j-1>=0 && map[i][j-1]==1)       //左 
        {
            map[i][j-1]=0;
            Push_Queue(&q,i*10+j-1);
        }
        if(j+1<=y && map[i][j+1]==1)       //右 
        {
            map[i][j+1]=0;
            Push_Queue(&q,i*10+j+1);
        } 
    } 
}
 
int SumIslands1(int **map,int x,int y)
{
    if(!map || x==0 || y==0)      //判断边界 
    {
        return 0;
    }
    int i,j,n=0;    //n代表统计岛屿的个数 
    for(i=0;i<x;i++)
    {
        for(j=0;j<y;j++)
        {
            if(map[i][j]==1)        //判断当前是否为1,若是则岛屿数量+1,并将其置0 
            {
                BFS(map,i,j,x,y);
                n++;
            }
        }
    }
    return n;
}
 
 
 
 
//DFS实现 
void DFS(int **map,int row,int col,int x,int y)
{
    map[row][col]=0;                    //将当前所在位置置0      
    if(row<0 || row >= x || col<0 || col>=y)                   //超出范围的情况 
    {
        return;                          
    }
    if(visited[row][col] || !map[row][col])                  //已经访问过了或者没有土地 
    {
        return;
    }
    visited[row][col]=1;
    DFS(map,row-1,col,x,y);              //上 
    DFS(map,row+1,col,x,y);              //下 
    DFS(map,row,col-1,x,y);              //左 
    DFS(map,row,col+1,x,y);              //右 
}
 
int SumIslands2(int **map,int x,int y)
{
    int i,j,n=0;    //n代表统计岛屿的个数
    if(!map || x == 0 || y==0)      //判断边界
    {
        return n;
    }
    for(i=0;i<x;j++)
    {
        for(j=0;j<y;j++)
        {
            if(map[i][j]==1 && !visited[i][j])        //判断当前是否为1,若是则岛屿数量+1,并将其置0
            {
                DFS(map,i,j,x,y);
                n++;
            }
        }
    }
    return n;
}
 
//输入数据函数,返回二维数组指针 
int** input(int *x,int *y)
{
    int i,j;
    printf("------------岛屿数量统计系统------------\n");
    printf("\n请输入地图\n"); 
    printf("\n------------岛屿数量统计系统------------\n");
    printf("请输入矩阵的行数和列数(空格分隔):"); 
    scanf("%d%d",x,y);
    int **map=(int **)malloc(sizeof(int*) * (*x));
    for(i=0;i<*x;i++)
    {
        map[i]=(int *)malloc(sizeof(int)*(*y));
        printf("请输入第%d行的数据(空格隔开):",i+1);
        for(j=0;j<*y;j++)
        {
            scanf("%d",&map[i][j]);
        }
    }
    return map; 
    
} 
 
 
//输出结果函数
void output(int result)
{
    printf("\n经计算,岛屿的数量:%d\n",result);
} 
 
//主函数 
int main()
{
    int x,y;            //矩阵的行数与列数 
    int **map;            //输入的二维数组 
    int result1,result2;            //岛屿数量
    int i,j;
    map=input(&x,&y);      //输入数据 
    result1=SumIslands1(map,x,y);             //使用BFS统计岛屿数量 
    result2=SumIslands2(map,x,y);             //使用DFS统计岛屿数量 
    printf("------------岛屿数量统计系统------------\n");
    printf("BFS:");
    output(result1);
    printf("DFS:");
    output(result2); 
    printf("------------岛屿数量统计系统------------\n");
    //释放动态分配的空间 
    for(i=0;i<x;i++)
    {
        free(map[i]); 
    }
    free(map);
    
    return 0;
}

  • 写回答

3条回答 默认 最新

  • 极客智能体-在线 2023-03-09 04:03
    关注

    以下答案由GPT-3.5大模型与博主波罗歌共同编写:
    问题分析:

    从代码上看,整体框架可以运行,但是存在以下几个问题:

    1. main函数中没有初始化visited数组,导致DFS算法无法正确运行。

    2. BFS算法中,队列存储的元素应该是二维数组中的坐标,而不是数字。

    3. DFS算法中,for循环中的变量j未初始化,需要修改。

    4. DFS算法中,for循环中的变量i应该从0开始循环,而不是j。

    修改方案:

    1. visited数组应该在main函数中初始化为0,可以通过如下代码进行初始化:
    for(i=0; i<x; i++)
    {
        for(j=0; j<y; j++)
        {
            visited[i][j] = 0;
        }
    }
    
    1. BFS算法中Push_Queue函数应该存储坐标,可以通过修改如下代码实现:
    int c[2] = {row, col};
    Push_Queue(&q, c);
    

    在Pop_Queue函数中也需要做相应的修改。

    1. DFS算法中需要将j的初始化从0改为j,如下:
    for(i=0; i<x; i++)
    {
        for(j=0; j<y; j++)
        {
            if(map[i][j]==1 && !visited[i][j])
            {
                DFS(map,i,j,x,y);
                n++;
            }
        }
    }
    
    1. DFS算法中需要在代码开头添加visited数组的初始化。

    修改后的完整代码如下:
    如果我的回答解决了您的问题,请采纳!

    评论

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 3月9日
  • 修改了问题 3月9日
  • 创建了问题 3月9日

悬赏问题

  • ¥15 Windows Script Host 无法找到脚本文件"C:\ProgramData\Player800\Cotrl.vbs”
  • ¥15 matlab自定义损失函数
  • ¥15 35114 SVAC视频验签的问题
  • ¥15 impedancepy
  • ¥15 求往届大挑得奖作品(ppt…)
  • ¥15 如何在vue.config.js中读取到public文件夹下window.APP_CONFIG.API_BASE_URL的值
  • ¥50 浦育平台scratch图形化编程
  • ¥20 求这个的原理图 只要原理图
  • ¥15 vue2项目中,如何配置环境,可以在打完包之后修改请求的服务器地址
  • ¥20 微信的店铺小程序如何修改背景图