C语言程序设计100例之(63):红与黑 |
您所在的位置:网站首页 › c语言铺地砖问题 › C语言程序设计100例之(63):红与黑 |
例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 |