算法:dfs
注意:这里标记并不是不能走过没走的路,只是把找到过的标记一下,防止重复找,陷入死循环
#include <iostream>
using namespace std;
const int N=30;
char g[N][N];
int n,m,ans=1;
void dfs(int x,int y)
{
int dx[4]={1,-1,0,0};
int dy[4]={0,0,1,-1};
for(int i=0; i<4; i++)
{
int x1 = x+dx[i], y1 = y+dy[i];
if(x1>=0 && x1<n && y1>=0 && y1<m && g[x1][y1] == '.')
{
// cout<<x1<<' '<<y1<<endl;
ans++;
g[x1][y1] = '#'; //这里不能写成g[x][y] = '#',这样会重复计算边界的几个黑瓷砖
dfs(x1,y1);
}
}
}
int main()
{
int x,y;
while(cin>>m>>n,n && m)
{
ans = 1;
for(int i=0; i<n; i++)
{
for(int j=0; j<m; j++)
{
cin>>g[i][j];
if(g[i][j] == '@') x = i, y = j;
}
}
dfs(x,y);
cout<<ans<<endl;
}
return 0;
}
不正经的总结:找路径,可以把前面的点(g[x][y])或当前的点(g[x1][y1])标记,
但如果要找全部的能走的点,只能标记当前的点,例如本题