输入包含多组数据。
每组数据第一行是两个整数 m 和 n(1≤m, n≤20)。紧接着 m 行,每行包括 n 个字符。每个字符表示一块瓷砖的颜色,规则如下:
1. “.”:黑色的瓷砖;
2. “#”:白色的瓷砖;
3. “@”:黑色的瓷砖,并且你站在这块瓷砖上。该字符在每个数据集合中唯一出现一次。
对应每组数据,输出总共能够到达多少块黑色的瓷砖。
9 6 ....#. .....# ...... ...... ...... ...... ...... #@...# .#..#.
45
/*DFS 堆栈溢出
#include<iostream>
#include<vector>
using namespace std;
char tile[20][20];
void DFS(int startx, int starty, int endx, int endy, int &curNum)
{
if (startx<0 || starty<0 || startx>endx || starty>endy || tile[startx][starty] == '#'){
// result = result<curNum ? curNum : result;
return;
}
if (tile[startx][starty] == '.')
curNum++;
tile[startx][starty] = '@';
int dx[4] = { 1, 0, 0, -1 };
int dy[4] = { 0, 1, -1, 0 };
for (int i = 0; i<4; i++)
DFS(startx + dx[i], starty + dy[i], endx, endy, curNum);
// curNum--;
// tile[startx][starty] = '.';
}
int main()
{
int m, n;
while (cin >> m >> n)
{
//vector<vector<char>> tile;
char t;
int startx = 0, starty = 0;
for (int i = 0; i<m; i++)
{
//vector<char> cur;
for (int j = 0; j<n; j++){
cin >> t;
tile[i][j]=t;
if (t == '@') { startx = i; starty = j; }
}
// tile.push_back(cur);
}
// int result = 0;
int curNum = 1;
DFS(startx, starty, m - 1, n - 1, curNum);
cout << curNum << endl;
}
return 0;
}*/
//法二:BFS
#include<iostream>
#include<queue>
using namespace std;
char tile[20][20];
int dxy[4][2] = { 1, 0, 0, 1, 0, -1, -1, 0 };
struct node{
int x;
int y;
};
int main()
{
int rows, cols;
while (cin >> rows >> cols)
{
int startx = 0, starty = 0;
for (int i = 0; i<rows; i++)
{
for (int j = 0; j<cols; j++)
{
cin >> tile[i][j];
if (tile[i][j] == '@'){ startx = i; starty = j; }
}
}
queue<node> q;
int result = 1;
node cur;
cur.x = startx;
cur.y = starty;
q.push(cur);
while (!q.empty())
{
node temp = q.front();
q.pop();
for (int i = 0; i<4; i++)
{
node next;
next.x = temp.x + dxy[i][0];
next.y = temp.y + dxy[i][1];
if (next.x<rows&&next.x>=0&&next.y<cols&&next.y>=0&&tile[next.x][next.y] == '.')
{
result++;
q.push(next);
tile[next.x][next.y] = '@';
}
}
}
cout << result << endl;
}
return 0;
}
广度优先遍历 #include<iostream> #include<vector> #include<string> #include<algorithm> #include<functional> #include <map> #include <set> #include <unordered_set> #include <unordered_map> #include <exception> #include <iomanip> #include <memory> #include <sstream> using namespace std; bool check(int x, int y, int m, int n, vector<vector<char>>& room) { return x >= 0 && x < m && y >= 0 && y < n && room[x][y] == '.'; } int main(int argc, char** argv) { //freopen("in.txt", "r", stdin); int m, n; while (cin >> m >> n) { vector<vector<char>> room(m, vector<char>(n)); string row; int sx, sy; for (int i = 0; i < m; ++i) { cin >> row; for (int j = 0; j < n; ++j) { room[i][j] = row[j]; if (room[i][j] == '@') { sx = i; sy = j; } } } vector<pair<int, int>> cur; cur.emplace_back(sx, sy); int count = 1; room[sx][sy] = ' '; while (!cur.empty()) { vector<pair<int, int>> next; for (auto& pr : cur) { int x = pr.first, y = pr.second; if (check(x - 1, y, m, n, room)) { ++count; room[x - 1][y] = ' '; next.emplace_back(x - 1, y); } if (check(x + 1, y, m, n, room)) { ++count; room[x + 1][y] = ' '; next.emplace_back(x + 1, y); } if (check(x, y - 1, m, n, room)) { ++count; room[x][y - 1] = ' '; next.emplace_back(x, y - 1); } if (check(x, y + 1, m, n, room)) { ++count; room[x][y + 1] = ' '; next.emplace_back(x, y + 1); } } cur = next; } cout << count << endl; } return 0; }
import java.util.*; public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); while (sc.hasNext()) { int m = sc.nextInt(); int n = sc.nextInt(); sc.nextLine(); Character[][] map = new Character[m][n]; Node start = null; for (int i = 0; i < m; i ++ ) { String s = sc.nextLine(); for (int j = 0; j < n; j ++ ) { map[i][j] = s.charAt(j); if(s.charAt(j) == '@') start = new Node(i, j); } } int[][] direction = {{0, 1}, {0, - 1}, {1, 0}, { - 1, 0}}; bfs(map, direction, start); } } public static void bfs(Character[][] map, int[][] direction, Node start) { Queue<Node> queue = new LinkedList<Node>(); boolean[][] visited = new boolean[map.length][map[0].length]; queue.add(start); visited[start.x][start.y] = true; int count = 1; while ( ! queue.isEmpty()) { Node cur = queue.poll(); for (int i = 0; i < 4; i ++ ) { Node next = new Node(cur.x + direction[i][0], cur.y + direction[i][1]); if(next.x >= 0 && next.x < map.length && next.y >= 0 && next.y < map[0].length && map[next.x][next.y] != '#' && ! visited[next.x][next.y]) { count ++ ; queue.add(next); visited[next.x][next.y] = true; } } } System.out.println(count); } static class Node { int x; int y; public Node(int x, int y) { this.x = x; this.y = y; } } }
//我用DFS爆栈了,下面是BFS package test; import java.util.LinkedList; import java.util.Queue; import java.util.Scanner; public class BlackAndRed { static boolean[][] visited; static int count; static int[][] direction = { { 0, 1 }, { 0, -1 }, { 1, 0 }, { -1, 0 } }; public static void main(String[] args) { Scanner in = new Scanner(System.in); while (in.hasNext()) { int x = in.nextInt(); int y = in.nextInt(); int a = -1, b = -1; char[][] ch = new char[x][y]; count=1; visited = new boolean[x][y]; for (int i = 0; i < x; i++) { String str = in.next(); for (int j = 0; j < y; j++) { ch[i][j] = str.charAt(j); if (ch[i][j] == '@') { a = i; b = j; } } } BFS(a, b, ch); System.out.println(count); } } public static void BFS(int x, int y, char[][] ch) { Queue<Node> queue = new LinkedList<Node>(); queue.add(new Node(x, y)); visited[x][y] = true; while (!queue.isEmpty()) { Node cur = queue.poll();// 拿出队头 for (int i = 0; i < 4; i++) { Node next = new Node(cur.x + direction[i][0], cur.y + direction[i][1]); if (next.x >= 0 && next.x < ch.length && next.y >= 0 && next.y < ch[0].length && ch[next.x][next.y] != '#' && !visited[next.x][next.y]) { count++; queue.add(next); visited[next.x][next.y] = true; } } } } static class Node { int x, y; public Node(int x, int y) { this.x = x; this.y = y; } } }
#include<iostream> #include<vector> using namespace std; int count=0; void Result(vector<vector<char>>&arr,int x,int y) { if(x<0||x>=arr.size()||y<0||y>=arr[0].size()||arr[x][y]=='#')//走不通 return; count++; arr[x][y]='#';//走过之后也不能走了 Result(arr,x-1,y);//上下左右 Result(arr,x+1,y); Result(arr,x,y-1); Result(arr,x,y+1); } int main() { int m=0,n=0; while(cin>>m>>n) { vector<vector<char>>v(m,vector<char>(n)); int x=0,y=0; for(int i=0;i<m;i++){ for(int j=0;j<n;j++){ cin>>v[i][j]; if(v[i][j]=='@') { x=i; y=j; } } } Result(v,x,y); cout<<count<<endl; count=0; } return 0; }
//DFS算法 // 我是用一个二维int型数组a[20][20]来记录的(数组默认全为0) //'.'记为0,'#'和'@'记为1(注意在输入的时候就可以判断)同时走过的格子也记为1 //那么对于一次DFS只要递归它的上、下、左、右4个相邻的格子就行 //由一个全局变量res记录结果 #include<iostream> #include<string.h> using namespace std; int a[20][20] = {0},res = 0,m,n;//注意是全局变量,多组数据时要在最后初始化 void dfs(int x,int y) { if(a[x][y]==1||x<0||x>=m||y<0||y>=n)//递归的边界条件 return ; res++; //结果增加1 a[x][y] = 1;//置1代表已经走过 dfs(x-1,y);//分别对应上 dfs(x+1,y);//下 dfs(x,y-1);//左 dfs(x,y+1);//右相邻格子 } int main() { while(~scanf("%d %d",&m,&n)) { getchar();//为什么要getchar()?因为第一行9 6后面还有一个换行符 int x,y; char c; for(int i=0;i<m;i++) { for(int j=0;j<n;j++) { scanf("%c",&c); if(c=='@') { x = i; y = j; }else{ if(c=='#') a[i][j] = 1; } } getchar();//同样的,吃掉每行最后一个换行符 } dfs(x,y); printf("%d\n",res); res = 0; memset(a,0,sizeof(a));//全局变量初始化 } return 0; }
// BFS广度优先搜索 import java.util.*; public class Main{ static class Node{ int x, y; public Node(int x, int y){ this.x = x; this.y = y; } } static int[][] direction = {{1, 0}, {-1, 0}, {0, 1}, {0, -1}}; public static void main(String[] args){ Scanner sc = new Scanner(System.in); while(sc.hasNext()){ String[] str = sc.nextLine().split(" "); int m = Integer.parseInt(str[0]); int n = Integer.parseInt(str[1]); char[][] tiles = new char[m][n]; // 利用boolean数组来记录走过的路以防重复 boolean[][] visited = new boolean[m][n]; // 开始的'@'就算做一个 int count = 1; Node start = null; for(int i = 0; i < m; i++){ String tmp = sc.nextLine(); for(int j = 0; j < n; j++){ tiles[i][j] = tmp.charAt(j); if(tiles[i][j] == '@'){ start = new Node(i, j); } // 将'#'也视作走过了 if(tiles[i][j] == '#'){ visited[i][j] = true; } } } Queue<Node> queue = new LinkedList<>(); queue.offer(start); visited[start.x][start.y] = true; while(!queue.isEmpty()){ Node cur = queue.poll(); // 搜索节点cur的四个方向 for(int i = 0; i < 4; i++){ Node next = new Node(cur.x+direction[i][0], cur.y+direction[i][1]); if(next.x >= 0 && next.x < m && next.y >= 0 && next.y < n && !visited[next.x][next.y]){ count++; queue.offer(next); visited[next.x][next.y] = true; } } } System.out.println(count); } } } // DFS深度优先搜索 import java.util.*; public class Main{ static int count; static int[][] direction = {{0,1}, {0,-1}, {1,0}, {-1,0}}; public static void dfs(int x, int y, char[][] tiles, int m, int n){ for(int i = 0; i < 4; i++){ int xx = x + direction[i][0]; int yy = y + direction[i][1]; if(xx >= 0 && xx < m && yy >= 0 && yy < n && tiles[xx][yy] == '.'){ count++; tiles[xx][yy] = '#'; dfs(xx, yy, tiles, m, n); } } } public static void main(String[] args){ Scanner sc = new Scanner(System.in); while(sc.hasNext()){ String[] str = sc.nextLine().split(" "); int m = Integer.parseInt(str[0]); int n = Integer.parseInt(str[1]); char[][] tiles = new char[m][n]; int startx = 0; int starty = 0; for(int i = 0; i < m; i++){ String tmp = sc.nextLine(); for(int j = 0; j < n; j++){ tiles[i][j] = tmp.charAt(j); if(tiles[i][j] == '@'){ startx = i; starty = j; } } } count = 1; dfs(startx, starty, tiles, m, n); System.out.println(count); } } }
#include <iostream> #include <vector> using namespace std; int maxBlack; void DFS(int n, int m, vector<vector<char>>& map, vector<vector<int>>& route) { if (map[n][m] == '#' || route[n][m] == 1) return; //n,m位置为黑方格且没走过 if (map[n][m] == '.' && route[n][m] == 0) { maxBlack++; route[n][m] = 1; } //右,上,左,下 if (m + 1 < map[0].size()) { DFS(n, m + 1, map, route); } if (n - 1 >= 0) { DFS(n - 1, m, map, route); } if (m - 1 >= 0) { DFS(n, m - 1, map, route); } if (n + 1 < map.size()) { DFS(n + 1, m, map, route); } } int main() { int n, m; while (cin >> n >> m) { //数组初始化 maxBlack = 1; vector<vector<char>> map; //地图 vector<vector<int>> route; //走过的路线 map.resize(n, vector<char>(m)); route.resize(n, vector<int>(m, 0)); //起始位置 int on, om; for (int i = 0; i < n; ++i) { for (int j = 0; j < m; ++j) { cin >> map[i][j]; //确认初始位置 if (map[i][j] == '@') { on = i; om = j; } } } DFS(on, om, map, route); cout << maxBlack << endl; } }
#include<iostream> #include<vector> using namespace std; int direct[4][2] = {{-1,0},{1,0},{0,-1},{0,1}}; void dfs(vector<vector<char>>& map,vector<vector<bool>>& flag,int row,int col,size_t& count) { //如果该位置已经遍历过了,则不用遍历 if(flag[row][col]){ return; } //遍历该位置 flag[row][col] = true; //如果该位置是白色瓷砖,则停止搜索 if('#' == map[row][col]){ return; } //否则为黑色瓷砖 count++; //然后继续向该位置的其他四个方向进行遍历 for(int i = 0; i < 4; i++){ int x = row + direct[i][0]; int y = col + direct[i][1]; if((x >=0 && x < map.size()) && (y >= 0 && y < map[0].size())){ dfs(map,flag,x,y,count); } } } int main() { int m,n; while(cin >> m >> n) { //接收矩阵 vector<vector<char>> map(m,vector<char>(n)); //看该点如果是黑,且有没有被遍历过 vector<vector<bool>> flag(m,vector<bool>(n)); int row = 0,col = 0; for(int i = 0; i < m; i++){ for(int j = 0; j < n; j++){ cin >> map[i][j]; if(map[i][j] == '@'){ row = i; col = j; } } } size_t count = 0; dfs(map,flag,row,col,count); cout << count << endl; } return 0; }
// write your code here cpp #include<iostream> #include<utility> #include<vector> #include<queue> using namespace std; int func(vector<vector<char>>& map) { int m=map.size(); int n=map[0].size(); int x; int y; int max=0;//记录最多黑砖 //找起点 for(int i=0;i<m;i++) { for(int j=0;j<n;j++) if(map[i][j]=='@') { x=i; y=j; } } max++; queue<pair<int,int>> vt; vt.push(make_pair(x,y)); map[x][y]='*';//表示访问过,防止死循环 while(!vt.empty()) { auto p = vt.front(); vt.pop(); x=p.first; y=p.second; const static int dx[]={1,-1,0,0}; const static int dy[]={0,0,1,-1}; for(int i=0;i<4;i++) { int newx=x+dx[i]; int newy=y+dy[i]; //坐标合法&&黑砖 if(newx>=0&&newx<m && newy>=0&&newy<n && map[newx][newy]=='.') { max++; vt.push(make_pair(newx,newy)); map[newx][newy]='*'; } } } return max; } int main() { int m; int n; while(cin>>m>>n) { vector<vector<char>> map(m,vector<char>(n)); for(int i=0;i<m;i++) for(int j=0;j<n;j++) cin>>map[i][j]; cout<<func(map)<<endl; } return 0; }
import java.util.*; public class Main{ public static void main(String[] args){ Scanner sc = new Scanner(System.in); while(sc.hasNext()){ Deque<Cool> que = new LinkedList<>(); int max = 0; int row = sc.nextInt(); int col = sc.nextInt(); int x = 0 , y = 0; String[][] map = new String[row][col]; for(int i = 0;i < row;i++){ char[] chArr = sc.next().toCharArray(); for(int j = 0;j < col; j++){ map[i][j] = chArr[j]+""; if(chArr[j] == '@'){ x = i; y = j; } } } que.add(new Cool(x,y)); while(!que.isEmpty()){ Cool co = que.poll(); x = co.x; y = co.y; if("#".equals(map[x][y])){ continue; } map[x][y] = "#"; max++; if(x+1 < row && ".".equals(map[x+1][y])){ que.add(new Cool(x+1,y)); } if(x-1 >= 0 && ".".equals(map[x-1][y])){ que.add(new Cool(x-1,y)); } if(y+1 < col && ".".equals(map[x][y+1])){ que.add(new Cool(x,y+1)); } if(y-1 >= 0 && ".".equals(map[x][y-1])){ que.add(new Cool(x,y-1)); } } System.out.println(max); } } private static class Cool{ private final int x; private final int y; public Cool(int x,int y){ this.x = x; this.y = y; } } }
import java.util.*; public class Main{ public static int count = 0; public static int[][] dir = {{-1,0},{1,0},{0,1},{0,-1}}; public static void dfs(char[][] map,int m,int n,int x,int y){ if(map[x][y] == '#'){ return; } count++; map[x][y] = '#'; for(int i = 0;i < 4;i++){ int xx = x + dir[i][0]; int yy = y + dir[i][1]; if(xx >= 0 && xx < m && yy >= 0 && yy < n ){ dfs(map,m,n,xx,yy); } } } public static void main(String[] args){ Scanner sc = new Scanner(System.in); while(sc.hasNext()){ int m = sc.nextInt(); int n = sc.nextInt(); char[][] map = new char[m][n]; int x = 0; int y = 0; for(int i = 0;i < m;i++){ String s = sc.next(); for(int j = 0;j < n;j++){ map[i][j] = s.charAt(j); //找到刚开始所站的位置 if(map[i][j] == '@'){ x = i; y = j; } } } count = 0; dfs(map,m,n,x,y); System.out.println(count); } } }
import java.util.*; public class Main{ public static int count = 0; public static int[][] dir = {{-1,0},{1,0},{0,1},{0,-1}}; public static void dfs(char[][] map,int m,int n,int x,int y){ for(int i = 0;i < 4;i++){ int xx = x + dir[i][0]; int yy = y + dir[i][1]; if(xx >= 0 && xx < m && yy >= 0 && yy < n && map[xx][yy] == '.'){ count++; map[xx][yy] = '#'; dfs(map,m,n,xx,yy); } } } public static void main(String[] args){ Scanner sc = new Scanner(System.in); while(sc.hasNext()){ int m = sc.nextInt(); int n = sc.nextInt(); char[][] map = new char[m][n]; int x = 0; int y = 0; for(int i = 0;i < m;i++){ String s = sc.next(); for(int j = 0;j < n;j++){ map[i][j] = s.charAt(j); //找到刚开始所站的位置 if(map[i][j] == '@'){ x = i; y = j; } } } count = 1; dfs(map,m,n,x,y); System.out.println(count); } } }
import java.util.Scanner; public class Main { static boolean[][] flag; static int ans = 0; public static void main(String[] args) { Scanner scanner = new Scanner(System.in); while (scanner.hasNext()) { int row = scanner.nextInt(); int col = scanner.nextInt(); int m = 0, n = 0; ans = 0; flag = new boolean[row][col]; char[][] map = new char[row][col]; for (int i = 0; i < row; i++) { String tmp = scanner.next(); for (int j = 0; j < col; j++) { map[i][j] = tmp.charAt(j); flag[i][j] = false; if (map[i][j] == '@') { m = i; n = j; } } } findBlack(map, m, n); System.out.println(ans); } } public static void findBlack(char[][] map, int m, int n) { if (m >= map.length || n >= map[0].length || m < 0 || n < 0 || map[m][n] == '#') { return; } if (flag[m][n]) { return; } ans++; flag[m][n] = true; findBlack(map, m + 1, n); findBlack(map, m, n + 1); findBlack(map, m, n - 1); findBlack(map, m - 1, n); } }
// write your code here cpp #include<iostream> #include<algorithm> #include<vector> #include<queue> using namespace std; int dx[]={0,1,0,-1}, dy[]={1,0,-1,0}; int ret=0; typedef pair<int,int> PII; queue<PII> q; void dfs(vector<vector<char>>& board,int x,int y,int m,int n) { ret++; board[x][y]='#'; for(int i=0;i<4;i++) { int new_x=x+dx[i],new_y=y+dy[i]; if(new_x>=0 && new_x<m && new_y>=0 && new_y<n && board[new_x][new_y]=='.') { dfs(board,new_x,new_y,m,n); } } } void bfs(vector<vector<char>>& board,int m,int n) { while(!q.empty()) { PII cur=q.front(); q.pop(); for(int i=0;i<4;i++) { int new_x=cur.first+dx[i],new_y=cur.second+dy[i]; if(new_x>=0 && new_x<m && new_y>=0 && new_y<n && board[new_x][new_y]=='.') { ret++; q.push({new_x,new_y}); board[new_x][new_y]='#'; } } } } int main() { int m,n; while(cin>>m>>n) { vector<vector<char>> board(m,vector<char>(n)); for(int i=0;i<m;i++) for(int j=0;j<n;j++) cin>>board[i][j]; for(int i=0;i<m;i++) for(int j=0;j<n;j++) { if(board[i][j]=='@') { //dfs(board,i,j,m,n); q.push({i,j}); ret++; bfs(board,m,n); cout<<ret<<endl; } } ret=0; } return 0; }
#include<iostream> #include<string> #include<vector> using namespace std; int arr[] = { -1,0,1 }; int getnum(vector<vector<int>>& ret, int i, int j) { ret[i][j] = 0; int sum = 1; for (int a = 0; a < 3; ++a) { for (int b = 0; b < 3; ++b) { if (i + arr[a] < ret.size() && i + arr[a] >= 0 && j + arr[b] < ret[0].size() && j + arr[b] >= 0 && ret[i + arr[a]][j + arr[b]]&&abs(arr[a])!=abs(arr[b])) sum+=getnum(ret, i + arr[a], j + arr[b]); } } return sum; } int main() { int m, n; while (cin >> m >> n) { vector<string> str; int num = 0; string temp; vector<vector<int>> ret(m, vector<int>(n, 1)); cin.get(); for (int i = 0; i<m; ++i) { getline(cin, temp); str.push_back(temp); } int n1=0, n2=0; for (int i = 0; i<m; ++i) { for (int j = 0; j<n; ++j) { if (str[i][j] == '#') ret[i][j] = 0; if (str[i][j] == '@') { n1 = i; n2 = j; } } } cout << getnum(ret, n1, n2) << endl; } return 0; }利用{-1,0,1}数组完成对四个格子的遍历
#include<vector> #include<iostream> #include<string> using namespace std; int index[4][2] = {{0,1},{0,-1},{1,0},{-1,0}}; int cnt; void DFS(vector<vector<int>>& book,vector<string>& board,int start_row,int start_col,int row,int col){ if((board[start_row][start_col]=='.'&& book[start_row][start_col] == 0) || board[start_row][start_col] == '@') cnt++; if(board[start_row][start_col]=='#') return; //将当前的坐标先进行标记 book[start_row][start_col] = 1; //进行深度优先遍历 for(int k = 0; k < 4; ++k){ int new_row = start_row + index[k][0]; int new_col = start_col + index[k][1]; if(new_row < 0 || new_row >= row || new_col < 0 || new_col >= col){ continue; } if(board[new_row][new_col] == '.' && book[new_row][new_col] == 0){ DFS(book,board,new_row,new_col,row,col); } } } int main(){ int N,M; while(cin >> N >> M){ //构建二维矩阵 vector<string> path(N); vector<vector<int>> book(N,vector<int>(M,0)); for(auto& e : path){ cin >> e; } //找到‘@’起始位置 for(int i = 0; i < N; ++i){ for(int j = 0; j < path[0].size(); ++j){ if(path[i][j]=='@'){ //进行深度优先遍历 DFS(book,path,i,j,N,M); } } } cout << cnt << endl; cnt=0; } return 0; }
// write your code here cpp #include<iostream> #include<vector> using namespace std; //通过vector创建的二维数组进行递归调用,把已经走过的结点标记成'1',避免访问过的 //结点重复计数 void BlackCount(vector<vector<char>>& v,int x,int y,int m,int n,int& count) { //count通过引用的方式,正好递归调用进行计数 if(x<0||y<0||x>=m||y>=n||v[x][y]=='1'||v[x][y]=='#') return; count++; v[x][y]='1'; BlackCount(v,x-1,y,m,n,count); BlackCount(v,x,y-1,m,n,count); BlackCount(v,x+1,y,m,n,count); BlackCount(v,x,y+1,m,n,count); } int main() { int m,n; while(cin>>m>>n) { int x,y; int count=0; vector<vector<char>> v(m,vector<char>(n,0)); for(size_t i=0;i<m;i++) { for(size_t j=0;j<n;j++) { cin>>v[i][j]; if(v[i][j]=='@') { x=i;//x标记起始i结点 y=j;//y表示起始j结点 } } } BlackCount(v,x,y,m,n,count); cout<<count<<endl; } return 0; }
}
#include<iostream> using namespace std; char map[21][21]; int dir[4][2]={-1,0,1,0,0,-1,0,1}; bool visited[21][21]; void game(int x,int y,int m,int n,int &step) { for(int i=0;i<4;i++) { int nx=x+dir[i][0]; int ny=y+dir[i][1]; if(nx>=1&&nx<=m&&ny>=1&&ny<=n&&visited[nx][ny]==false&&map[nx][ny]=='.') { visited[nx][ny]=true; game(nx,ny,m,n,step=step+1); } } } int main() { int m,n; while(cin>>m>>n) { int cx,cy,step=1; for(int i=1;i<=m;i++) for(int j=1;j<=n;j++) { visited[i][j]=false; cin>>map[i][j]; if(map[i][j]=='@') { cx=i;cy=j; } } visited[cx][cy]=true; game(cx,cy,m,n,step); cout<<step<<endl; } return 0; }