Red and Black
http://acm.hdu.edu.cn/diy/contest_showproblem.php?cid=12573&pid=1001
Time Limit : 2000/1000ms (Java/Other) Memory Limit : 65536/32768K (Java/Other)
Total Submission(s) : 9 Accepted Submission(s) : 8
Font: Times New Roman | Verdana | Georgia
Font Size: ← →
Problem 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)
Output
6 9 ....#. .....# ...... ...... ...... ...... ...... #@...# .#..#. 11 9 .#......... .#.#######. .#.#.....#. .#.#.###.#. .#.#..@#.#. .#.#####.#. .#.......#. .#########. ........... 11 6 ..#..#..#.. ..#..#..#.. ..#..#..### ..#..#..#@. ..#..#..#.. ..#..#..#.. 7 7 ..#.#.. ..#.#.. ###.### ...@... ###.### ..#.#.. ..#.#.. 0 0
Sample Output
45 59 6 13
Source
#include<iostream>
using namespace std;
const int N=25;
char map[N][N];
int visited[N][N];
int cnt;
int d[4][2]={{1,0},{-1,0},{0,1},{0,-1}}; //方向
void DFS(int r,int c){
if(map[r][c]=='#'||visited[r][c]==1) return; //此路不通或已搜索过
visited[r][c]=1;
cnt++;
for(int i=0;i<4;i++)
DFS(r+d[i][0],c+d[i][1]);
return;
}
int main(){
int row,col; //行数和列数
int r,c; //始点的行数和列数
while(scanf("%d%d%*c",&col,&row)==2){
if(col==0 && row==0 ) break;
for( int i=1;i<=row;i++){
for(int j=1;j<=col;j++){
scanf("%c",&map[i][j]);
if(map[i][j]=='@'){
r=i;
c=j;
}
}
getchar();
}
for(int i=0;i<=col+1;i++)
map[0][i]=map[row+1][i]='#';
for(int i=1;i<=row;i++)
map[i][0]=map[i][col+1]='#';
for(int i=0;i<=row+1;i++)
for(int j=0;j<=col+1;j++)
visited[i][j]=0;
cnt=0;
DFS(r,c);
printf("%d\n",cnt);
}
return 0;
}
//深度优先搜索
#include<iostream>
using namespace std;
const int N=25;
char map[N][N];
int visited[N][N];
int cnt;
int d[4][2]={{1,0},{-1,0},{0,1},{0,-1}}; //方向
int row,col; //行数和列数
void DFS(int r,int c){
if(r<=row && r>=1 && c<=col && c>=1){
if(map[r][c]=='#'||visited[r][c]==1) return; //此路不通或已搜索过
visited[r][c]=1;
cnt++;
for(int i=0;i<4;i++)
DFS(r+d[i][0],c+d[i][1]);
}
return;
}
int main(){
int r,c; //始点的行数和列数
while(scanf("%d%d%*c",&col,&row)==2){
if(col==0 && row==0 ) break;
for( int i=1;i<=row;i++){
for(int j=1;j<=col;j++){
scanf("%c",&map[i][j]);
if(map[i][j]=='@'){
r=i;
c=j;
}
}
getchar();
}
/*for(int i=0;i<=col+1;i++)
map[0][i]=map[row+1][i]='#';
for(int i=1;i<=row;i++)
map[i][0]=map[i][col+1]='#'; */
for(int i=1;i<=row;i++)
for(int j=1;j<=col;j++)
visited[i][j]=0;
cnt=0;
DFS(r,c);
printf("%d\n",cnt);
}
return 0;
}
下面是广度优先搜索:
#include<iostream>
#include<queue>
using namespace std;
const int N=25;
int d[4][2]={{1,0},{-1,0},{0,1},{0,-1}};
int row,col; //行与列
int cnt; //计数
char map[N][N];
struct Node{
int x,y;
};
Node no,p;
void BFS(int r,int c){
queue<Node>q;
no.x=r;
no.y=c;
map[r][c]='#'; //搜索过的点置为#
cnt++;
q.push(no);
while(!q.empty()){
no=q.front();
q.pop();
for(int i=0;i<4;i++){
int x=no.x+d[i][0],y=no.y+d[i][1];
if(x>=1 && x<=row && y>=1 && y<=col){
if(map[x][y]=='.'){
p.x=x;
p.y=y;
cnt++;
map[x][y]='#';
q.push(p);
}
}
}
}
}
int main(){
int r,c; //始点的行号与列号
while(scanf("%d%d%*c",&col,&row)!=EOF){
if(col==0 && row==0 ) break;
for(int i=1;i<=row;i++){
for(int j=1;j<=col;j++){
scanf("%c",&map[i][j]);
if(map[i][j]=='@'){
r=i;
c=j;
}
}
getchar();
}
cnt=0;
BFS(r,c);
printf("%d\n",cnt);
}
return 0;
}
本文介绍了一种在红黑方格地图中寻找可达黑色方格数量的算法问题,通过深度优先搜索(DFS)和广度优先搜索(BFS)两种方法实现,并提供了完整的代码示例。
138

被折叠的 条评论
为什么被折叠?



