1 package com.algorithm.test;
2
3 import java.util.ArrayDeque;
4 import java.util.Scanner;
5
6 public class DfsAndBfs {
7
8 private static final int[][] dir = {
9 {0,1},
10 {0,-1},
11 {1,-1},
12 {1,0},
13 {1,1},
14 {-1,-1},
15 {-1,0},
16 {-1,1},
17 };
18
19 private static int[][] vis;
20 private static char[][] map = {
21 {'*','*','*','*','@'},
22 {'*','@','@','*','@'},
23 {'*','@','*','*','@'},
24 {'@','@','@','*','@'},
25 {'@','@','*','*','@'},
26 };
27
28 private static Node q;
29
30 private static Node pos;
31
32 private static ArrayDeque<Node> que;
33
34 private static Scanner cin;
35
36 public static void main(String[] args) {
37 cin = new Scanner(System.in);
38 // cinDataForBfs();
39 cinDataForDfs();
40 }
41
42
43 public static void cinDataForBfs() {
44 while(cin.hasNext()) {
45 int m = cin.nextInt();
46 int n = cin.nextInt();
47 if(m == 0 && n == 0) {
48 break;
49 }
50 int ans = 0;
51 for(int i = 0; i < m; i++) {
52 for(int j = 0; j < n; j++) {
53 if(map[i][j] == '@') {
54 ans++;
55 bfs(i,j,m,n);
56 }
57 }
58 }
59 System.out.println(ans);
60 }
61 }
62
63 public static void cinDataForDfs() {
64 while(cin.hasNext()) {
65 int m = cin.nextInt();
66 int n = cin.nextInt();
67 if(m == 0 && n == 0) {
68 break;
69 }
70 int ans = 0;
71 for(int i = 0; i < m; i++) {
72 for(int j = 0; j < n; j++) {
73 if(map[i][j] == '@') {
74 ans++;
75 dfs(i,j,m,n);
76 }
77 }
78 }
79 System.out.println(ans);
80 }
81 }
82
83
84 public static void dfs(int x, int y, int m, int n) {
85 for(int i = 0; i < 8; i ++) {
86 int xx = x + dir[i][0];
87 int yy = y + dir[i][1];
88 if(xx >= 0 && xx < n && yy >= 0 && yy < m && map[xx][yy] == '@'){
89 map[xx][yy] = '*';
90 dfs(xx,yy,m,n);
91 }
92 }
93 }
94
95 public static void bfs(int x, int y,int m, int n) {
96 vis = new int[105][105];
97 for(int i = 0; i < 105; i ++) {
98 for(int j = 0; j < 105; j++) {
99 vis[i][j] = 0;
100 }
101 }
102 que = new ArrayDeque<Node>();
103 que.clear();
104 pos = new Node();
105 q = new Node();
106 pos.x = x;
107 pos.y = y;
108 vis[x][y] = 1;
109 que.add(pos);
110 while(!que.isEmpty()) {
111 pos = que.poll();
112 map[pos.x][pos.y] = '*';
113 for(int i = 0; i < 8; i++) {
114 int next_x = pos.x + dir[i][0];
115 int next_y = pos.y + dir[i][1];
116 if(next_x >=0 && next_x < m && next_y >= 0 && next_y < n && vis[next_x][next_y] == 0) {
117 q.x = next_x;
118 q.y = next_y;
119 vis[next_x][next_y] = 1;
120 map[next_x][next_y] = '*';
121 que.add(q);
122 }
123 }
124 }
125
126 }
127
128 }
129 class Node{
130 public int x, y;
131 }