Red and Black
题目链接:
http://poj.org/problem?id=1979
解题思路:
搜索的水题,第一次用bfs做题,感觉这种水题,练不熟悉的东西最好啦。
AC代码:
#include <iostream>
#include <cstdio>
#include <queue>
using namespace std;
const int dx[] = {0,-1,0,1},dy[] = {-1,0,1,0};
int n,m,ans;
char maze[25][25];
struct node{
int x,y;
};
queue<node> q;
void dfs(int x,int y){
/*for(int i=0;i<m;i++)
{
for(int j=0;j<n;j++)
cout<<maze[i][j];
cout<<endl;
}*/
for(int i=0;i<4;i++){
int xx=x+dx[i],yy=y+dy[i];
if(xx<0||xx>=m||yy<0||yy>=n)
continue;
if(maze[xx][yy]=='.'){
ans++;
maze[xx][yy]='#';
dfs(xx,yy);
}
}
}
void bfs(){
node cur,next;
while(!q.empty()){
cur=q.front();
q.pop();
ans++;
for(int i=0;i<4;i++){
next.x=cur.x+dx[i];
next.y=cur.y+dy[i];
if(next.x<0||next.x>=m||next.y<0||next.y>=n)
continue;
if(maze[next.x][next.y]=='.'){
maze[next.x][next.y]='#';
q.push(next);
}
}
}
}
int main(){
while(scanf("%d%d",&n,&m),m+n){
int i,j;
ans=0;
while(!q.empty())
q.pop();
for(i=0;i<m;i++)
scanf("%s",maze[i]);
for(i=0;i<m;i++)
for(j=0;j<n;j++)
if(maze[i][j]=='@'){
//*
dfs(i,j);
ans++;
//*/
/*
node start;
start.x=i;start.y=j;
q.push(start);
bfs();
*/
break;
}
printf("%d\n",ans);
}
return 0;
}