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

HDU 4414 Finding crosses 暴力枚举

题意:在#o组成的n*n(3<=n<=50)的图中找到等长十字架长度至少为3,并且周围一圈没有#的十字架的个数。
题解:枚举每一个#假设其为一个合法十字架的中心位置即可。

Sure原创,转载请注明出处。
[cpp] 
#include <iostream> 
#include <cstdio> 
using namespace std; 
const int maxn = 52; 
const int move[4][2] = {{-1,0},{0,1},{1,0},{0,-1}}; 
char map[maxn][maxn]; 
int n; 
 
void read() 

    for(int i=0;i<n;i++) 
    { 
        scanf("%s",map[i]); 
    } 
    return; 

 
bool judge(int x,int y) 

    if(x >= 0 && y >= 0 && x < n && y < n && map[x][y] == '#') 
    { 
        return true; 
    } 
    return false; 

 
bool check(int x,int y) 

    int i = 1; 
    for(;;i++) 
    { 
        bool flag = true; 
        for(int j=0;j<4;j++) 
        { 
            int tx = x + i * move[j][0]; 
            int ty = y + i * move[j][1]; 
            if(judge(tx , ty) == false) 
            { 
                flag = false; 
            } 
            else 
            { 
                int pos = (j + 1) % 4; 
                int xx = tx + move[pos][0]; 
                int yy = ty + move[pos][1]; 
                if(judge(xx,yy)) return false; 
 
                pos = (j + 3) % 4; 
                xx = tx + move[pos][0]; 
                yy = ty + move[pos][1]; 
                if(judge(xx,yy)) return false; 
            } 
        } 
        if(flag == false) break; 
    } 
    if(i == 1) return false; 
    for(int j=0;j<4;j++) 
    { 
        int tx = x + i * move[j][0]; 
        int ty = y + i * move[j][1]; 
        if(judge(tx , ty)) return false; 
    } 
    return true; 

 
void solve() 

    int cnt = 0; 
    for(int i=0;i<n;i++) 
    { 
        for(int j=0;j<n;j++) 
        { 
            if(map[i][j] == '#') 
            { 
                if(check(i,j)) cnt++; 
            } 
        } 
    } 
    printf("%d\n",cnt); 
    return; 
}  www.zzzyk.com
 
int main() 

    while(~scanf("%d",&n) && n) 
    { 
        read(); 
        solve(); 
    } 
    return 0; 

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