用深搜和广搜两种方法解题---黑色格子

给一个字符矩阵,“.”代表黑色格子,“#”代表红色格子,有一个起点“@”,它属于黑色格子,一个人从起点出发,只能走黑色格子,并且只能上下左右走,不能对角线走,问这个人能走到的黑色格子有多少个。输出个数。输入WH,代表有W列,H行,然后输入一个字符矩阵,输出能走到的最多的黑色格子的个数,包括起点。

 广度优先搜索:

#include <stdio.h>

#include <string.h>

#include <iostream>

using namespace std;

int num;

char map[25][25];

int visited[25][25];

int dir[4][2] = {0, -1, 1, 0, 0, 1, -1, 0};

void DFS(int x, int y, int n, int m)

{

  int mx, my;

  for(int i = 0; i<4; i++)

  {

    mx = x+dir[i][0]; my = y+dir[i][1];

    if(mx>=1 && mx<=n && my>=1 && my<=m && !visited[mx][my] && map[mx][my]=='.')

    {

      visited[mx][my] = 1;

      num++;

      DFS(mx, my, n, m);

    }

  }

}

 

int main()

{

  int n, m, x, y;

  while(scanf("%d%d", &m, &n)!=EOF && (n || m))

  {

    num = 1;

    memset(visited, 0, sizeof(visited));

    for(int i = 1; i<=n; i++)

    {

      for(int j = 1; j<=m; j++)

      {

        cin>>map[i][j];

        if(map[i][j] == '@')

        {

          x = i;

          y = j;

          visited[x][y] = 1;

        }

      }

    }

 

    DFS(x, y, n, m);

    printf("%d\n", num);

  }

 

  return 0;

}

深度优先搜索:

#include <stdio.h>

#include <queue>

using namespace std;

#define MAXN 25

bool vis[MAXN][MAXN];

char map[MAXN][MAXN];

int W, H, result, dx[4] = {1, 0, -1, 0}, dy[4] = {0, -1, 0, 1};

struct Tile { // 以状态(棋子坐标)为结点

    int x, y;

}tile[MAXN*MAXN];

queue <Tile> q;

bool reachable(Tile next)

{

    return map[next.x][next.y] != '#' && next.x >= 1 && next.x <= W && next.y >= 1 && next.y <= H;

}

void bfs()

{

    Tile cur, next;

    while (!q.empty())

    {

        cur = q.front();

        q.pop();

        result++;

        for (int i = 0; i < 4; ++i)

       {

            next.x = cur.x + dx[i];

            next.y = cur.y + dy[i];

            if (reachable(next) && !vis[next.x][next.y])

            {

               vis[next.x][next.y] = true;

               q.push(next);

            }

        }

    }

}

int main()

{

    int i, j;

    Tile start;

    while (scanf("%d%d", &W, &H), W && H)

    {

        result = 0;

        memset(vis, false, sizeof(vis)); // 数据初始化

        for (i = 1; i <= H; ++i)

            for (j = 1; j <= W; ++j)

            {

                scanf(" %c", &map[j][i]); // x y

                if (map[j][i] == '@')

                {

                    start.x = j;

                    start.y = i;

                    vis[j][i] = true;

                    q.push(start);

                }

            }  

        bfs();

        printf("%d\n", result);

    }

    return 0;

}











二、考试范围   考试科目1:计算机与网络基础知识   1. 计算机科学基础   1.1 数制及其转换     二进制、十进制和十六进制等常用数制及其相互转换   1.2 数据的表示     数的表示(原码、反码、补码表示,整数和实数的机内表示)     非数值表示(字符和汉字表示、声音表示、图像表示)     校验方法和校验码(奇偶校验)   1.3 算术运算     计算机中的二进制数运算方法   2. 计算机系统基础知识   2.1 硬件基础知识     计算机系统的结构和工作原理     CPU的结构、特征、分类及发展     存储器的结构、特征分类及发展     I/O接口、I/O设备和通信设备   2.2 软件基础知识     操作系统的类型、配置     操作系统的功能     数据库系统基础知识     应用软件的安装与配置     网络管理软件的功能   3. 计算机网络基础知识   3.1 数据通信基础知识     数据信号、信道的基本概念     数据通信模型的构成     数据传输基础知识      数据编码的分类和基本原理     多路复用技术的分类、基本原理和应用领域     数据交换技术的分类、基本原理和性能特点   3.2 计算机网络基础知识     计算机网络的概念、分类和构成     协议的概念,开放系统互连参考模型的结构及各层的功能     TCP/IP协议的概念及IP数据报的格式、IP地址、子网掩码和域名   3.3 局域网技术基础     IEEE802参考模型     局域网拓扑结构     局域网媒体访问控制技术CSMA/CD     以太网的发展历程     以太网的分类及各种以太网的性能特点     以太网技术基础、IEEE802.3帧结构、以太网跨距     交换型以太网、全双工以太网的基本原理和特点   4. 计算机网络应用基础知识   4.1 因特网应用基础知识     因特网的概念、起源和提供的基本服务,以及我国的因特网现状     通过PSTN、ISDN、ADSL和局域网拉入因特网的基本原理和特性     WWW、主页、超级链接、HTML的概念及应用     电子邮件、FTP、Telnet、BBS、ICQ、网络新闻组、网络传真、网络视频会议、电子商务和电子政务的概念及应用   4.2 网络操作系统基础知识     网络操作系统的概念、结构和特点     Windows操作系统的安装、配置和基本应用     Linux操作系统的安装、配置和基本应用、KDE环境和Linux操作命令   4.3 应用服务器基础知识     DNS服务的基本原理     WWW服务的基本原理     FTP服务的基本原理     电子邮件服务的基本原理 等等
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值