题目描述
有一间长方形的房子,地上铺了红色、黑色两种颜色的正方形瓷砖。
你站在其中一块黑色的瓷砖上,只能向相邻(上下左右四个方向)的黑色瓷砖移动。
请写一个程序,计算你总共能够到达多少块黑色的瓷砖
样例
blablabla
算法1
(bfs) $O(n^2)$
blablabla
时间复杂度
参考文献
C++ 代码
#include<iostream>
#include<queue>
#include<algorithm>
#define x first
#define y second
using namespace std;
typedef pair<int,int> PII;
const int N = 25;
char g[N][N];
int n,m;
int bfs(int sx,int sy)
{
queue<PII> q;
q.push({sx,sy});
g[sx][sy]='#';
int res = 0;
int dx[]={-1,0,1,0},dy[]={0,1,0,-1};
while(q.size())
{
auto t = q.front();
q.pop();
res++;
for(int i = 0;i < 4;i++)
{
int x = t.x + dx[i],y = t.y + dy[i];
if(x<0||x>=n||y<0||y>=m||g[x][y]!='.')continue;
g[x][y]='#';
q.push({x,y});
}
}
return res;
}
int main()
{
while(cin>>m>>n,m||n)
{
for(int i = 0;i < n;i++) cin>>g[i];
int x,y;
for(int i = 0;i < n;i++)
for(int j = 0;j < m;j++)
if(g[i][j]=='@')
{
x=i;
y=j;
}
cout<<bfs(x,y)<<endl;
}
return 0;
}
算法2
(dfs) $O(n^2)$
blablabla
时间复杂度
参考文献
C++ 代码
#include<iostream>
#include<queue>
#include<algorithm>
using namespace std;
const int N = 25;
char g[N][N];
int n,m;
int dx[]={-1,0,1,0},dy[]={0,1,0,-1};
int dfs(int x,int y)
{
int res = 1;
g[x][y] = '#';
for(int i = 0;i < 4;i++)
{
int a=x+dx[i],b=y+dy[i];
if(a>=0&&a<n&&b>=0&&b<m&&g[a][b]=='.')
res += dfs(a,b);
g[x][y]=='.';
}
return res;
}
int main()
{
while(cin>>m>>n,m||n)
{
for(int i = 0;i < n;i++) cin>>g[i];
int x,y;
for(int i = 0;i < n;i++)
for(int j = 0;j < m;j++)
if(g[i][j]=='@')
{
x=i;
y=j;
}
cout<<dfs(x,y)<<endl;
}
return 0;
}