題目很好懂,只搜索能到達的地方,統計數量,啥也不做。很坑爹的地方是,行列輸入是反的!
AC代碼:31MS 364K,空間還可以優化,直接不用開visit數組,直接把訪問後的點置為障礙即可。
[cpp]
#include <iostream>
#include <string>
#include <cstdio>
#include <cmath>
#include <vector>
#include <algorithm>
#include <sstream>
#include <cstdlib>
#include <fstream>
#include <queue>
using namespace std;
struct node1{
int x,y;
}start,p,q;
queue<node1> Q;
bool visit[20][20];
char maze[20][20];
int dir[4][2] = {-1, 0, 0, 1, 1, 0, 0, -1};//shang,右,xia,左
int m,n,cnt;
bool isbond(node1 &a){
if(a.x<0 || a.x>=m || a.y<0 || a.y>=n || maze[a.x][a.y]=='#')return 1;
return 0;
}
int bfs()
{
while(!Q.empty())Q.pop();
cnt=1;
memset(visit,0,sizeof(visit));
Q.push(start);
visit[start.x][start.y]=1;
while(!Q.empty())
{
p=Q.front();
Q.pop();
for(int i=0;i<4;i++)
{
q.x=p.x+dir[i][0];
q.y=p.y+dir[i][1];
if(isbond(q))continue;
if(visit[q.x][q.y])continue;
cnt++;
visit[q.x][q.y]=1;
Q.push(q);
}
}
return cnt;
}
int main()
{
//ifstream fin;
//fin.open("data1.txt");
while(cin>>n>>m)
{
if(m==0&&n==0)break;
for(int i=0;i<m;i++){
for(int j=0;j<n;j++){
cin>>maze[i][j];
if(maze[i][j]=='@'){
start.x=i;
start.y=j;
}
}
}
cout<<bfs()<<endl;
}
return 0;
}
#include <iostream>
#include <string>
#include <cstdio>
#include <cmath>
#include <vector>
#include <algorithm>
#include <sstream>
#include <cstdlib>
#include <fstream>
#include <queue>
using namespace std;
struct node1{
int x,y;
}start,p,q;
queue<node1> Q;
bool visit[20][20];
char maze[20][20];
int dir[4][2] = {-1, 0, 0, 1, 1, 0, 0, -1};//shang,右,xia,左
int m,n,cnt;
bool isbond(node1 &a){
if(a.x<0 || a.x>=m || a.y<0 || a.y>=n || maze[a.x][a.y]=='#')return 1;
return 0;
}
int bfs()
{
while(!Q.empty())Q.pop();
cnt=1;
memset(visit,0,sizeof(visit));
Q.push(start);
visit[start.x][start.y]=1;
while(!Q.empty())
{
p=Q.front();
Q.pop();
for(int i=0;i<4;i++)
{
q.x=p.x+dir[i][0];
q.y=p.y+dir[i][1];
if(isbond(q))continue;
if(visit[q.x][q.y])continue;
cnt++;
visit[q.x][q.y]=1;
Q.push(q);
}
}
return cnt;
}
int main()
{
//ifstream fin;
//fin.open("data1.txt");
while(cin>>n>>m)
{
if(m==0&&n==0)break;
for(int i=0;i<m;i++){
for(int j=0;j<n;j++){
cin>>maze[i][j];
if(maze[i][j]=='@'){
start.x=i;
start.y=j;
}
}
}
cout<<bfs()<<endl;
}
return 0;
}