题目很简单,一次AC,思路是输入grid时就统计出共有多少个油井(‘@’),深度优先函数dfs(x,y,count)的三个参数是行号、列号和剩余的未访问油井数。主函数中从(0,0)开始遍历grid,当出现某个油井且未被访问时,油田计数器加1,接着递归调用dfs函数将与该油井相连(横、竖或对角线)的所有油井访问并标记,这些油井共同构成一块油田。主函数遍历到(m-1,n-1)时结束,所得的油田计数器即为不相连通的油田数。
在编译的时候出现了LNK1107的致命错误,重新下载了一个Kernel32.Lib替代原文件就好了。
代码如下
#include<iostream>
#include<cstring>
using namespace std;
char grid[110][110];
bool visit[110][110];
int m,n,depositcount;
bool over;
void dfs(int x,int y,int &count)
{
if (count==0)
{
over=1;
return;
}
if (x<0||x>=m||y<0||y>=n) return;
if (grid[x][y]=='@'&&!visit[x][y])
{
visit[x][y]=1;
count--;
dfs(x-1,y-1,count);
dfs(x-1,y,count);
dfs(x-1,y+1,count);
dfs(x,y-1,count);
dfs(x,y+1,count);
dfs(x+1,y-1,count);
dfs(x+1,y,count);
dfs(x+1,y+1,count);
}
}
int main()
{
while (cin>>m>>n&&m&&n)
{
int oilcount=0;
over=0;
memset(visit,0,sizeof(visit));
for (int i=0;i<m;i++)
{
for (int j=0;j<n;j++)
{
cin>>grid[i][j];
if (grid[i][j]=='@')
{
oilcount++;
}
}
}
depositcount=0;
for (int i=0;i<m;i++)
{
for (int j=0;j<n;j++)
{
if (grid[i][j]=='@'&&!visit[i][j])
{
depositcount++;
dfs(i,j,oilcount);
if (over==1) break;
}
}
if (over==1) break;
}
cout<<depositcount<<endl;
}
return 0;
}