C语言程序设计100例之(63):红与黑

您所在的位置:网站首页 c语言铺地砖问题 C语言程序设计100例之(63):红与黑

C语言程序设计100例之(63):红与黑

2023-12-23 08:54| 来源: 网络整理| 查看: 265

例63   红与黑

问题描述

有一间长方形的房子,地上铺了红色、黑色两种颜色的正方形瓷砖。你站在其中一块黑色的瓷砖上,只能向相邻的黑色瓷砖移动。请写一个程序,计算你总共能够到达多少块黑色的瓷砖。

输入

包括多个数据集合。每个数据集合的第一行是两个整数W和H,分别表示x方向和y方向瓷砖的数量。W和H都不超过20。在接下来的H行中,每行包括W个字符。每个字符表示一块瓷砖的颜色,规则如下

1)‘.’:黑色的瓷砖;

2)‘#’:白色的瓷砖;

3)‘@’:黑色的瓷砖,并且你站在这块瓷砖上。该字符在每个数据集合中唯一出现一次。

当在一行中读入的是两个零时,表示输入结束。

输出

对每个数据集合,分别输出一行,显示你从初始位置出发能到达的瓷砖数(记数时包括初始位置的瓷砖)。

输入样例

6 9

....#.

.....#

......

......

......

......

......

#@...#

.#..#.

0 0

输出样例

45

        (1)编程思路。

        设函数f(x, y)计算从点(x,y)出发能够走过的黑瓷砖总数,则

        f(x, y) = 1 + f(x - 1, y) + f(x + 1, y) + f(x, y - 1) + f(x, y + 1)

        若点(x,y)超过了房子的范围(x < 0 || x >= w || y < 0 || y >= h)或该处为白色瓷砖,则f(x, y)的返回值为0。

        编写简单的递归函数即可。在函数中凡是走过的黑色瓷砖不能够被重复走过。可以通过每走过一块瓷砖就将它作标记的方法(最简单的方法是将其标记为白色瓷砖)保证不重复计算任何黑色瓷砖。

(2)源程序。

#include

int w,h;

char map[21][21];

int f(int x, int y)

{

    if(x < 0 || x >= w || y < 0 || y >= h)   // 如果走出房子范围

       return 0;

    if(map[x][y] == '#')

       return 0;

    map[x][y] = '#';                 // 将走过的瓷砖做标记

    return 1 + f(x-1, y)+f(x+1,y)+f(x,y-1)+f(x,y+1);

}

int main()

{

    int i, j;

    while(scanf("%d %d", &h, &w) && w!=0 && h!=0)

    {

       for (i = 0; i < w; i++)

          scanf("%s", map[i]);

       for (i = 0; i < w; i++)

          for(j = 0; j < h; j++)

             if (map[i][j]=='@') printf("%d\n", f(i,j));

    }

    return 0;

}

习题63 63-1 马走日

问题描述

马在中国象棋以日字形规则移动。

请编写一段程序,给定n*m大小的棋盘,以及马的初始位置(x,y),要求不能重复经过棋盘上的同一个点,计算马可以有多少途径遍历棋盘上的所有点。

输入

第一行为整数T(T < 10),表示测试数据组数。

每一组测试数据包含一行,为四个整数,分别为棋盘的大小以及初始位置坐标n,m,x,y。(0



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3