• ZOJ 1047 Image Perimeters


    原题链接

    题目大意:鼠标点击一块,求与之联通的所有区域的边长之和。

    解法:广度优先搜索。从选中的这个点开始,往周围8个点依次搜索,访问过的点做上标记。如果该点上下左右的一个或多个方向没有相邻的点,边长+1。代码BSF函数中,有两个数组存放相邻8个点的坐标,这一段代码感觉很简洁,是从其他地方学习来的。

    参考代码:

    #include<iostream>
    #include<cstring>
    #include<cstdio>
    #include<queue>
    using namespace std;
    
    int r,c,x,y,i,j,ans;
    int visited[22][22],grid[22][22];
    char s;
    int BFS(int i,int j);
    
    struct Node{
    	int x,y;
    }p,q;
    
    int main(){
    	
    
    	while(cin>>r>>c>>x>>y){
    		if(r==0&&c==0&&x==0&&y==0)break;
    		memset(grid,0,sizeof(grid));
    		memset(visited,0,sizeof(visited));
    		ans=0;
    		for(i=1;i<=r;i++){
    			for(j=1;j<=c;j++){
    				cin>>s;
    				if(s=='X')grid[i][j]=1;
    				if(s=='.')grid[i][j]=0;
    			}
    			getchar();
    		}								//first fill the matrix with 0 or 1
    		ans=BFS(x,y);					// do broad first search in this matrix
    		cout<<ans<<endl;
    	}
    	
    	return 0;
    }
    
    int BFS(int i,int j){
    	int k,num,x0,y0;
    	int sx[9]={0,-1,1,0,0,-1,-1,1,1};
    	int sy[9]={0,0,0,-1,1,-1,1,-1,1};
    	queue<Node> point;
    
    	p.x=i;
    	p.y=j;
    	point.push(p);			//push the first node in queue
    	visited[x][y]=1;
    
    	while(!point.empty()){		//if the queue is not empty, pop the front, visit it and push its neighbours
    		q=point.front();
    		point.pop();
    		num=0;
    		for(k=1;k<=8;k++){
    			x0=q.x+sx[k];
    			y0=q.y+sy[k];
    			if(grid[x0][y0]){
    				if(k<=4)num++;		//another 'X' is next to this side
    				if(!visited[x0][y0]){
    					visited[x0][y0]=1;
    					p.x=x0;
    					p.y=y0;
    					point.push(p);
    				}
    			}					//until the queue is empty
    		}
    		ans+=4-num;
    	}
    	return ans;
    }
    
  • 相关阅读:
    html5传感器
    html5 canvas手写字代码(兼容手机端)
    PHP pdo单例模式连接数据库
    PHP变量回收
    PHP不过过滤防止xss攻击的方法
    jquery监听回车
    jquery预加载显示百分比
    创建自己的代码仓库
    Luxurious Houses
    Vasya the Hipster
  • 原文地址:https://www.cnblogs.com/naive/p/3568730.html
Copyright © 2020-2023  润新知