您的位置:首页 > 其它

hdu 1241 Oil Deposits(水一发,自我的DFS)

2016-08-24 21:59 417 查看


解题思路:

  1. 遍历扫描二维数组,遇到‘@’,结果ans++;

  2. 将当前 i,j 位置置为‘*’,将当前‘@’的 i,j 传人到DFS函数中,开始遍历八个方向的字符

   如果碰到 '@' 则先将当前置为‘*’,然后再次递归传递,直到超出界限或者扫描不到‘@’,结束递归

  3. DFS()的作用是将i,j为开始周围连续的“@”全部改为‘*’

  4. 最后输出 ans 即可;

Ac code :

#include<bits/stdc++.h>
using namespace std;
char xstr[104][104];
static int ans;
int x,y;
void dfs(int i,int j)
{

if(j+1<y&&xstr[i][j+1]=='@')
{
xstr[i][j+1]='*';
dfs(i,j+1);
}
if(i+1<x&&j-1>=0&&xstr[i+1][j-1]=='@')
{
xstr[i+1][j-1]='*';
dfs(i+1,j-1);
}
if(i+1<x&&xstr[i+1][j]=='@')
{
xstr[i+1][j]='*';
dfs(i+1,j);
}
if(i+1<x&&j+1<y&&xstr[i+1][j+1]=='@')
{
xstr[i+1][j+1]='*';
dfs(i+1,j+1);
}
if(i-1>=0&&j+1<y&&xstr[i-1][j+1]=='@')
{
xstr[i-1][j+1]='*';
dfs(i-1,j+1);
}
if(j-1>=0&&xstr[i][j-1]=='@')
{
xstr[i][j-1]='*';
dfs(i,j-1);
}
if(i-1>=0&&xstr[i-1][j]=='@')
{
xstr[i-1][j]='*';
dfs(i-1,j);
}
if(i-1>=0&&j-1>=0&&xstr[i-1][j-1]=='@')
{
xstr[i-1][j-1]='*';
dfs(i-1,j-1);
}
}
int main()
{

while(scanf("%d%d",&x,&y)!=EOF&&x+y)
{
ans=0;
memset(xstr,0,sizeof(xstr));
int i,j;
for(i=0; i<x; i++)
{
scanf("%s",&xstr[i]);
}
for(i=0; i<x; i++)
{
for(j=0; j<y; j++)
{
if(xstr[i][j]=='@')
{
xstr[i][j]='*';
ans++;
dfs(i,j);
}
}
}
printf("%d\n",ans);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: