题目来源:北京大学POJhttp://poj.org/problem?id=1979
Description
Write a program to count the number of black tiles which he can reach by repeating the moves described above.
Input
There are H more lines in the data set, each of which includes W characters. Each character represents the color of a tile as follows.
'.' - a black tile
'#' - a red tile
'@' - a man on a black tile(appears exactly once in a data set)
The end of the input is indicated by a line consisting of two zeros.
Output
Sample Input
6 9 ....#. .....# ...... ...... ...... ...... ...... #@...# .#..#. 11 9 .#......... .#.#######. .#.#.....#. .#.#.###.#. .#.#..@#.#. .#.#####.#. .#.......#. .#########. ........... 11 6 ..#..#..#.. ..#..#..#.. ..#..#..### ..#..#..#@. ..#..#..#.. ..#..#..#.. 7 7 ..#.#.. ..#.#.. ###.### ...@... ###.### ..#.#.. ..#.#.. 0 0
Sample Output
45 59 6 13
这个题目可以用回溯法解决,跟我博客里面的“贪吃蛇游戏”有些类似,见代码:
// RedAndBlack.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" #include <stdio.h> #include <string.h> char matrix[20][20]; int path = 0; int rows; int cols; void search(int m, int n) { if (m >= 0 && n >= 0 && m < rows && n < cols && (matrix[m][n] == '@' || matrix[m][n] == '.' ) ) { path++; matrix[m][n] = '0'; search(m,n+1); search(m+1,n); search(m-1,n); search(m,n-1); } } int main() { int i,j,m,n; //freopen("in.txt","r",stdin); while(1) { memset(matrix,'\0',20*20); path = 0; scanf("%d %d\n",&cols,&rows); if (cols == 0) break; for (i = 0; i < rows; i++) for (j = 0; j < cols; j++) { scanf("%c ",&matrix[i][j]); if (matrix[i][j] == '@') { m = i; n = j; } } search(m,n); printf("%d\n",path); } return 0; }