当前位置:编程学习 > C/C++ >>

uva572 图和图的遍历,一次AC!

题目很简单,一次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;  
}  

 

 
补充:软件开发 , C++ ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,