zoukankan      html  css  js  c++  java
  • 再解炸弹人,dfs&bfs

    输入样例:

    13 13 3 3
    #############
    #GG.GGG#GGG.#
    ###.#G#G#G#G#
    #.......#..G#
    #G#.###.#G#G#
    #GG.GGG.#.GG#
    #G#.#G#.#.#.#
    ##G...G.....#
    #G#.#G###.#G#
    #...G#GGG.GG#
    #G#.#G#G#.#G#
    #GG.GGG#G.GG#
    #############

    输出样例:

    炸弹放置在(8,12),消灭敌人最多为10

    • 深搜代码:

    #include<cstdio>
    #include<iostream>
    #define INF 10000000
    using namespace std;
    char a[20][20];
    int b[20][20];
    int next[4][2]={{0,1},{1,0},{0,-1},{-1,0}};//四个方向
    int maxx=0,mx,my,tx,ty,n,m;
    int getsum(int x,int y)//计算一共可以消灭的敌人
    {
        int sum=0;
        int i=x,j=y;
        while(a[i][j]!='#')//向下
        {
            if(a[i][j]=='G')sum++;
            i++;
        }
        i=x;j=y;
        while(a[i][j]!='#')//向上
        {
            if(a[i][j]=='G')sum++;
            i--;
        }
        i=x;j=y;
        while(a[i][j]!='#')//向左
        {
            if(a[i][j]=='G')sum++;
            j--;
        }
        i=x;j=y;
        while(a[i][j]!='#')//向右
        {
            if(a[i][j]=='G')sum++;
            j++;
        }
        return sum;
    }
    
    void dfs(int x,int y)
    {
        int sum=getsum(x,y);
        if(sum>maxx)//更新最大值
        {
            maxx=sum;
            mx=x;
            my=y;
        }
        for(int i=0;i<4;i++)
        {
            tx=x+next[i][0];
            ty=y+next[i][1];
            if(tx>n||ty>m||tx<1||ty<1)//判断越界
                continue;
            if(b[tx][ty]==0&&a[tx][ty]=='.')//未被标记并且是空地
            {
                b[tx][ty]=1;//此处不用还原标记数组,因为不是找路径而是记录每个点消灭敌人的数
                dfs(tx,ty);
            }
        }
        return ;
    }
    
    int main()
    {
        int sx,sy;
        scanf("%d%d%d%d",&n,&m,&sx,&sy);
        for(int i=1;i<=n;i++)
            for(int j=1;j<=m;j++)
                scanf(" %c",&a[i][j]);
        dfs(sx,sy);
        printf("炸弹放置在(%d,%d),消灭敌人最多为%d
    ",mx,my,maxx);
        return 0;
    }
    • 广搜代码:

    #include<cstdio>
    #include<iostream>
    #define INF 10000000
    using namespace std;
    char a[20][20];
    int b[20][20];
    int next[4][2]={{0,1},{1,0},{0,-1},{-1,0}};//四个方向
    
    struct node//用结构体模拟队列
    {
        int x;
        int y;
    
    }que[410];
    
    int getsum(int x,int y)//计算一共可以消灭的敌人
    {
        int sum=0;
        int i=x,j=y;
        while(a[i][j]!='#')//向下
        {
            if(a[i][j]=='G')sum++;
            i++;
        }
        i=x;j=y;
        while(a[i][j]!='#')//向上
        {
            if(a[i][j]=='G')sum++;
            i--;
        }
        i=x;j=y;
        while(a[i][j]!='#')//向左
        {
            if(a[i][j]=='G')sum++;
            j--;
        }
        i=x;j=y;
        while(a[i][j]!='#')//向右
        {
            if(a[i][j]=='G')sum++;
            j++;
        }
        return sum;
    }
    
    int main()
    {
        int n,m,sx,sy,tx,ty,mx,my;
        scanf("%d%d%d%d",&n,&m,&sx,&sy);
        //getchar();
        for(int i=1;i<=n;i++)
            for(int j=1;j<=m;j++)
                scanf(" %c",&a[i][j]);
        //初始化队列
        int head=1;
        int tail=1;
        //将起点入队
        que[tail].x=sx;
        que[tail].y=sy;
        tail++;//队尾指针++,队尾指针要指向空队列
        b[sx][sy]=1;//标记起点
        int maxx=getsum(sx,sy);
        int flag=0,sum;
        //开始广搜
        while(head<tail)//队列不为空
        {
            for(int i=0;i<4;i++)//四个方向搜索
            {
                //计算从父亲(head)点到下一个点
                tx=que[head].x+next[i][0];
                ty=que[head].y+next[i][1];
                if(tx<1||ty<1||tx>n||ty>m)//是否越界
                {
                    continue;
                }
                if(b[tx][ty]==0&&a[tx][ty]=='.')//这个点没有走过并且是空地
                {
                    b[tx][ty]=1;//标记走过,此处与深搜不同,不能还原标记
                    //将此点入队
                    que[tail].x=tx;
                    que[tail].y=ty;
                    tail++;//队尾指针++
                    sum=getsum(tx,ty);
                    if(sum>maxx)
                    {
                        maxx=sum;
                        mx=tx;
                        my=ty;
                    }
                }
            }
            head++;//四个方向可以进入路径的都已入队,将head出队
        }
        printf("炸弹放置在(%d,%d),消灭敌人最多为%d
    ",mx,my,maxx);
        return 0;
    }
  • 相关阅读:
    Thinkphp5.0 模型hasOne、hasMany、belongsTo详解
    ES6中async和await说明和用法
    必会SQL练习题
    Git初识学习
    CI框架简单使用
    JavaScript 的 this 原理
    javascript实现游戏贪吃蛇
    js清除childNodes中的#text(选项卡中会用到获取第一级子元素)
    JavaNIO
    MongoDB入门_shell基本操作
  • 原文地址:https://www.cnblogs.com/boboyuzz/p/10426194.html
Copyright © 2011-2022 走看看