广度优先搜索之最大杀敌数

在你的位置放置一个炸弹,放在哪点能杀最多的敌人,你的位置不能和敌人相同

 输入
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#
#############

输出

将炸弹放置在(7,11),最多可以消灭 10 个敌人

#include<stdio.h>
char a[20][21];
int book[20][20],max,mx,my,n,m;
int getnum(int i,int j)
 {
     int sum,x,y;
     sum = 0; // sum 用来 计数(可以消灭的敌人数),所以需要初始化 0
     // 将坐标 i,j 复制到 两个新变量 x,y 中,以便以后 向上下左右四个方向统计 可以消灭的的人数

     //向上 统计消灭 的敌人数
      x = i; y = j;
      while(a[x][y] != '#') // 判断的点是不是墙,如果不是墙就继续
      {
          // 如果当前的点是敌人,则进行计数
          if(a[x][y] == 'G') sum++;
          // x-- 的作用是继续向 上 统计
          x--;
      }
       //向下 统计消灭 的敌人数
       x = i; y = j;
      while(a[x][y] != '#') // 判断的点是不是墙,如果不是墙就继续
      {
          // 如果当前的点是敌人,则进行计数
          if(a[x][y] == 'G') sum++;
          // x++ 的作用是继续向 下 统计
          x++;
      }
    //向左 统计消灭 的敌人数
       x = i; y = j;
      while(a[x][y] != '#') // 判断的点是不是墙,如果不是墙就继续
      {
          // 如果当前的点是敌人,则进行计数
          if(a[x][y] == 'G') sum++;
          // y-- 的作用是继续向左 统计
          y--;
      }
      //向右 统计消灭 的敌人数
       x = i; y = j;
      while(a[x][y] != '#') // 判断的点是不是墙,如果不是墙就继续
      {
          // 如果当前的点是敌人,则进行计数
          if(a[x][y] == 'G') sum++;
          // y++ 的作用是继续向 右 统计
          y++;
      }
      return sum;
 }
 void dfs(int x,int y)
 {
     // 定义一个 用于 走的方向 的数组
     int next[4][2] ={
         {0,1}, // 向右走
         {1,0},  // 向下走
         {0,-1}, // 向左走
         {-1,0} // 向上走
                    };
    int k,sum,tx,ty;
     sum = getnum(x,y);// 计算当前这个点消灭的 敌人总数
     if(sum > max)
      {
         // 如果当前的 点 统计出的 所能消灭 的敌人数 大于 max ,则更新 max,并用 mx,my 记录当前的点的 坐标
         max = sum;
         mx = x;
         my = y;
      }
      // 枚举 四个 方向
        for(k = 0; k <= 3; k++)
        {
            // 下一个结点的坐标
            tx = x + next[k][0];
            ty = y + next[k][1];
            // 判断是否越界
            if(tx < 0 || tx > n - 1 || ty < 0 || ty > m - 1) continue;
            if(a[tx][ty] == '.' && book[tx][ty] == 0)
            {
                book[tx][ty] = 1; // 标记这个点已经走过
                dfs(tx,ty);
            }
        }
        return ;
 }
 int main()
 {
     int i,startx,starty;
     scanf("%d%d%d%d",&n,&m,&startx,&starty);
     // 读入 n 行 字符
     for(i = 0; i <= n - 1; i++)
        scanf("%s",a[i]);
     // 从 你 站的位置开始 尝试
     book[startx][starty] = 1;
     max = getnum(startx,starty);
     mx = startx;
     my = starty;
     dfs(startx,starty);
     printf("将炸弹放置在(%d %d),最多可以消灭 %d 个敌人\n",mx,my,max);
     return 0;
 }

时间: 2024-09-20 13:51:38

广度优先搜索之最大杀敌数的相关文章

SDUT 2141 【TEST】数据结构实验图论一:基于邻接矩阵的广度优先搜索遍历

数据结构实验图论一:基于邻接矩阵的广度优先搜索遍历 Time Limit: 1000MS Memory Limit: 65536KB Submit Statistic Discuss Problem Description 给定一个无向连通图,顶点编号从0到n-1,用广度优先搜索(BFS)遍历,输出从某个顶点出发的遍历序列.(同一个结点的同层邻接点,节点编号小的优先遍历) Input 输入第一行为整数n(0< n <100),表示数据的组数.对于每组数据,第一行是三个整数k,m,t(0<

数据结构实验之图论二:基于邻接表的广度优先搜索遍历

数据结构实验之图论二:基于邻接表的广度优先搜索遍历 Time Limit: 1000ms   Memory limit: 65536K  有疑问?点这里^_^ 题目描述 给定一个无向连通图,顶点编号从0到n-1,用广度优先搜索(BFS)遍历,输出从某个顶点出发的遍历序列.(同一个结点的同层邻接点,节点编号小的优先遍历) 输入 输入第一行为整数n(0< n <100),表示数据的组数. 对于每组数据,第一行是三个整数k,m,t(0<k<100,0<m<(k-1)*k/2,

图算法系列-深度优先搜索与广度优先搜索

2.深度优先搜索 为了访问一个顶点,我们将它标记为已经访问过,然后递归的访问所有与子邻接的并且尚未标记的顶点,这就是深度优先搜索(DFS),DFS常用于解决路径问题. 比如下面的连通图,我们从顶点0开始对图进行探索 下面这个图显示了DFS处理时的递归调用树. DFS可以解决的问题:1)环检测:一个图中有环吗?该图是森林吗?2)简单路径:给定两个顶点,是否存在一条连接他们的路径3)简单连通性:无论何时使用DFS,都可以在线性时间内确定一个图是否连通4)顶点搜索:在给定顶点所在的同一个连通分量中有多

地牢逃脱(BFS(广度优先搜索))

题目描述 给定一个 n 行 m 列的地牢,其中 '.' 表示可以通行的位置,'X' 表示不可通行的障碍,牛牛从 (x0 , y0 ) 位置出发,遍历这个地牢,和一般的游戏所不同的是,他每一步只能按照一些指定的步长遍历地牢,要求每一步都不可以超过地牢的边界,也不能到达障碍上.地牢的出口可能在任意某个可以通行的位置上.牛牛想知道最坏情况下,他需要多少步才可以离开这个地牢. 输入描述: 每个输入包含 1 个测试用例.每个测试用例的第一行包含两个整数 n 和 m(1 <= n, m <= 50),表示

SDUT 2142 【TEST】数据结构实验之图论二:基于邻接表的广度优先搜索遍历

数据结构实验之图论二:基于邻接表的广度优先搜索遍历 Time Limit: 1000MS Memory Limit: 65536KB Submit Statistic Discuss Problem Description 给定一个无向连通图,顶点编号从0到n-1,用广度优先搜索(BFS)遍历,输出从某个顶点出发的遍历序列.(同一个结点的同层邻接点,节点编号小的优先遍历) Input 输入第一行为整数n(0< n <100),表示数据的组数.对于每组数据,第一行是三个整数k,m,t(0<

广度优先搜索(BFS)

广度优先 Description: 阿狸被困在迷宫,snoopy要去救他,snoopy可以向上.下.左.右四个方向行走,每走一步(格)就要喝掉一瓶益力多.现在给它一个迷宫地图请问:snoopy最少需要多少瓶益力多才能走出迷宫? Input: 先输入一个数t,表示测试的数据个数, 下面输入的就是t个迷宫, 每个迷宫的输入都应包含以下数据, 输入迷宫的大小 n(n<=15),表示迷宫大小为n*n. 再输入迷宫, 用大写字母“S”表示snoopy的位置, 用小写字母“E”表示阿狸被困的位置, 用“.”

数据结构实验图论一:基于邻接矩阵的广度优先搜索遍历

数据结构实验图论一:基于邻接矩阵的广度优先搜索遍历 Time Limit: 1000ms   Memory limit: 65536K  有疑问?点这里^_^ 题目描述 给定一个无向连通图,顶点编号从0到n-1,用广度优先搜索(BFS)遍历,输出从某个顶点出发的遍历序列.(同一个结点的同层邻接点,节点编号小的优先遍历) 输入 输入第一行为整数n(0< n <100),表示数据的组数. 对于每组数据,第一行是三个整数k,m,t(0<k<100,0<m<(k-1)*k/2,

UVa1601 The Morning after Halloween (双向广度优先搜索)

链接:http://acm.hust.edu.cn/vjudge/problem/51163分析:已知起点和终点可以利用双向广度优先搜索,正向扩展一层,反向扩展一层,为防止退化,优先扩展结点数多的方向.因为障碍物很多防止TLE,可以先把图除了‘#’抠下来,用cnt给位置编号,x[cnt],y[cnt]为编号为cnt的格子的横纵坐标,id记录坐标为x,y格子的编号,然后找这些格子周围能走的格子,用deg[cnt]保存编号为cnt的格子周围能走的格子数,用G[cnt][i]保存编号为cnt的格子周围

图的搜索算法之广度优先搜索

图的邻接表表示 对图(有向或无向)G=<V,E>(为方便记,假定V=1,2,-,n),其邻接表表示是一个由|V|个链表组成数组.对每一个u∈V,链表Adj[u]称为相应顶点u的邻接表.它包括G中全部与u相邻的顶点.每一个邻接表中顶点一般是按随意顺序存放的. 无向图的邻接表表示 有向图的邻接表表示 广度优先搜索(Broad First Search) 1.问题的理解与描写叙述 给定一个图(有向或无向)G=<V,E>和当中的一个源顶点s.广度优先搜索系统地探索G的边以"发现&