题目描述
李老师给定了一个由 m×n 个方格组成的迷宫,从左上角编号 (1,1) 至右下角编号 (m,n) 。
在所有的方格中,有个特殊的格点 @
,代表起点,剩余每个格点上标有 .
或 #
的符号,其中 .
代表不能通行,#
代表可以通行。
你的任务:从起点 @
开始,统计可以经过多少个 #
。
输入格式
第一行两个整数 m 和 n ,且 1≤m,n≤50。
接下来给定一个 m×n 的迷宫,由 .
或 #
或 @
组成 。
输出格式
一个结果,为从 @
开始可以通过的 #
的数量。
样例 #1
样例输入 #1
3 4
.##.
.@..
####
样例输出 #1
6
#include <iostream>
#include <queue>
using namespace std;
int n,m,cnt,sx,sy;
char a[51][51];
bool vis[51][51];
int dis[4][2]={{0,1},{1,0},{-1,0},{0,-1}};
struct node
{
int x,y;
};
queue<node>que;
void bfs()
{
que.push((node){sx,sy});
vis[sx][sy]=true;
while(que.size()>0)
{
node t=que.front();
que.pop();
//cout<<endl<<t.x<<" "<<t.y<<":";
for(int i=0;i<4;i++)
{
int nx=t.x+dis[i][0];
int ny=t.y+dis[i][1];
if(nx<1||nx>n||ny<1||ny>m)
continue;
if(vis[nx][ny]||a[nx][ny]=='.')
continue;
que.push((node){nx,ny});
vis[nx][ny]=true;
cnt++;
//cout<<nx<<" "<<ny<<" ";
}
}
}
int main()
{
cin>>n>>m;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
{
cin>>a[i][j];
if(a[i][j]=='@')
{
sx=i;
sy=j;
}
}
bfs();
cout<<cnt;
return 0;
}
复杂度:O(nm)
最开始一切正常,样例“仿佛”是对的。但是全WA了,我又研究样例。我发现样例“正确”是因为我把起点算上了,其实是错的。经过一番调试,我发现是判断是否出界时把m写成n了……