Red and Black
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 23820 Accepted Submission(s): 14412
Problem Description
There is a rectangular room, covered with square tiles. Each tile is colored either red or black. A man is standing on a black tile. From a tile, he can move to one of four adjacent tiles. But he can't move on red tiles, he can move only on black tiles.
Write a program to count the number of black tiles which he can reach by repeating the moves described above.
Write a program to count the number of black tiles which he can reach by repeating the moves described above.
Input
The input consists of multiple data sets. A data set starts with a line containing two positive integers W and H; W and H are the numbers of tiles in the x- and y- directions, respectively. W and H are not more than 20.
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)
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)
Output
For each data set, your program should output a line which contains the number of tiles he can reach from the initial tile (including itself).
Sample Input
6 9 ....#. .....# ...... ...... ...... ...... ...... #@...# .#..#. 11 9 .#......... .#.#######. .#.#.....#. .#.#.###.#. .#.#..@#.#. .#.#####.#. .#.......#. .#########. ........... 11 6 ..#..#..#.. ..#..#..#.. ..#..#..### ..#..#..#@. ..#..#..#.. ..#..#..#.. 7 7 ..#.#.. ..#.#.. ###.### ...@... ###.### ..#.#.. ..#.#.. 0 0
Sample Output
45 59 6 13
简单的bfs解决 直接上代码!!!
import java.util.LinkedList;
import java.util.Queue;
import java.util.Scanner;
class Node {
int x;
int y;
}
public class Main {
static int dir[][] = {{1,0},{-1,0},{0,1},{0,-1}};
static char arr[][];
static Queue<Node> queue;
static int time;
private static void bfs() {
Node f = new Node();
f.x = 0;
f.y = 0;
Node sNode = new Node();
sNode.x = 0;
sNode.y = 0;
while (!queue.isEmpty()) {
f = queue.poll();
for (int i = 0; i < 4; i++) {
sNode.x =f.x + dir[i][0];
sNode.y =f.y + dir[i][1];
if (sNode.x>=0&&sNode.x<arr.length&&sNode.y>=0&&sNode.y<arr[0].length) {
if (arr[sNode.x][sNode.y]=='.') {
Node node = new Node();
node.x = sNode.x;
node.y = sNode.y;
queue.add(node);
time++;
arr[sNode.x][sNode.y] = '#';
}
}
}
}
}
@SuppressWarnings("resource")
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
queue = new LinkedList<Node>();
while (scanner.hasNext()) {
time = 0;
int n =scanner.nextInt();
int m =scanner.nextInt();
if (n == 0&&m ==0) {
break;
}
arr= new char[m][n];
for (int i = 0; i < m; i++) {
String xString = scanner.next();
for (int j = 0; j < n; j++) {
arr[i][j] = xString.charAt(j);
}
}
for (int i = 0; i < arr.length; i++) {
for (int j = 0; j < arr[0].length; j++) {
if (arr[i][j]=='@') {
Node q= new Node();
q.x = i;
q.y = j;
queue.add(q);
bfs();
}
}
}
System.out.println(time+1);
}
}
}