zoukankan      html  css  js  c++  java
  • Image Perimeters

    Description

    给出一张由"x"和"."组成的矩阵。每个"x"可以向上下左右及两个斜对角进行连通,请问由某个点开始的"x",它所连通的图形的周长为多少。

    Input

    整个测试有多组数据,整个测试以四个零代表结束。
    对于每个数据,第一行给出整个图形的大小(长度小于50),再给出开始点的坐标。接下来若干行用于描述这个图形。

    Output

    如题

    Sample Input

    2 2 2 2
    XX
    XX
    6 4 2 3
    .XXX
    .XXX
    .XXX
    ...X
    ..X.
    X...
    5 6 1 3
    .XXXX.
    X....X
    ..XX.X
    .X...X
    ..XXX.
    7 7 2 6
    XXXXXXX
    XX...XX
    X..X..X
    X..X...
    X..X..X
    X.....X
    XXXXXXX
    7 7 4 4
    XXXXXXX
    XX...XX
    X..X..X
    X..X...
    X..X..X
    X.....X
    XXXXXXX
    0 0 0 0

    Sample Output

    8
    18
    40
    48
    8

    这道题是找连通块,只是多了斜线,算周长只要在四周打点,ans++,剩下就是BFS日常操作。

    八个方向:

    int dir[8][2]={{0,1},{1,0},{-1,0},{0,-1},{1,1},{1,-1},{-1,1},{-1,-1}};
    

    结构体:

    struct node{
    	int x;
    	int y;
    	node(){ };
    	node (int sx,int sy){
    		x=sx;
    		y=sy;
    	}
    };
    

    BFS主体:

    void bfs(int x,int y){
    	q1.push(node(x,y));
    	vis[x][y]=1;
    	while(!q.empty()){
    		node prg = q.front();
    		q.pop();
    		
    		
    		for(int i=0;i<8;i++){
    			int tx = prg.x+dir[i][0];
    			int ty = prg.y+dir[i][1]; 
    		
    		
    			if(!vis[tx][ty]&&mp[tx][ty] == 'X'){
    				q.push(node(tx,ty));
    				q1.push(node(tx,ty));
    				vis[tx][ty]=1;
    			}
    		}
    	} 
    }
    
    

    打点,计算答案:

    void change(){
    	for(int i=0;i<=n+1;i++){
    		for(int j=0;j<=m+1;j++){
    			if(mp[i][j]!='X'&&mp[i][j]!='.'){
    					mp[i][j]='.';
    			}
    		}
    	}
    		q.push(node(x,y));
    		bfs(x,y);
    	while(!q1.empty()){
    			node prg = q1.front();
    			q1.pop();
    		for(int i=0;i<4;i++){
    				int tx=prg.x+dir[i][0];
    				int ty=prg.y+dir[i][1];
    			if(mp[tx][ty]=='.'){
    					ans++;
    			}
    		}
    	}
    }
    
    

    完整代码:

    #include<bits/stdc++.h>
    using namespace std;
    
    int ans=0;
    
    int dir[8][2]={{0,1},{1,0},{-1,0},{0,-1},{1,1},{1,-1},{-1,1},{-1,-1}};
    
    struct node{
    	int x;
    	int y;
    	node(){ };
    	node (int sx,int sy){
    		x=sx;
    		y=sy;
    	}
    };
    
    char mp[1001][1001];
    bool vis[1001][1001];
    
    
    queue<node> q;
    queue<node> q1;
    
    
    void bfs(int x,int y){
    	q1.push(node(x,y));
    	vis[x][y]=1;
    	while(!q.empty()){
    		node prg = q.front();
    		q.pop();
    		
    		
    		for(int i=0;i<8;i++){
    			int tx = prg.x+dir[i][0];
    			int ty = prg.y+dir[i][1]; 
    		
    		
    			if(!vis[tx][ty]&&mp[tx][ty] == 'X'){
    				q.push(node(tx,ty));
    				q1.push(node(tx,ty));
    				vis[tx][ty]=1;
    			}
    		}
    	} 
    }
    
    int n,m,x,y;
    
    void change(){
    	for(int i=0;i<=n+1;i++){
    		for(int j=0;j<=m+1;j++){
    			if(mp[i][j]!='X'&&mp[i][j]!='.'){
    					mp[i][j]='.';
    			}
    		}
    	}
    		q.push(node(x,y));
    		bfs(x,y);
    	while(!q1.empty()){
    			node prg = q1.front();
    			q1.pop();
    		for(int i=0;i<4;i++){
    				int tx=prg.x+dir[i][0];
    				int ty=prg.y+dir[i][1];
    			if(mp[tx][ty]=='.'){
    					ans++;
    			}
    		}
    	}
    }
    
    int main(){
    	
    	while(cin >> n >> m>> x>>y&&n&&m){
    		
    		ans=false;
    		
    		memset(vis,0,sizeof vis);
            memset(mp,'',sizeof mp);
    		
    		
    		for(int i=1;i<=n;i++){
    			for(int j=1;j<=m;j++){
    				cin >> mp[i][j];
    			}
    		} 
    		change();
    		cout<< ans << endl;
    	}
    	
    	return 0;
    }
    
  • 相关阅读:
    【转载】Linux的进程间通信-信号量
    【转载】高性能数据库连接池的内幕
    【转载】我是一块硬盘(下)
    【转载】我是一块硬盘(上)
    69. Sqrt(x)
    68. Text Justification
    67. Add Binary
    66. Plus One
    65. Valid Number
    64. Minimum Path Sum
  • 原文地址:https://www.cnblogs.com/A-Konnyaku/p/11199159.html
Copyright © 2011-2022 走看看