zoukankan      html  css  js  c++  java
  • HDU4414 Finding crosses(模拟 || DFS)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?

    pid=4414


    Finding crosses

    Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
    Total Submission(s): 1282    Accepted Submission(s): 696

    Problem Description
    The Nazca Lines are a series of ancient geoglyphs located in the Nazca Desert in southern Peru. They were designated as a UNESCO World Heritage Site in 1994. The high, arid plateau stretches more than 80 kilometres (50 mi) between the towns of Nazca and Palpa on the Pampas de Jumana about 400 km south of Lima. Although some local geoglyphs resemble Paracas motifs, scholars believe the Nazca Lines were created by the Nazca culture between 400 and 650 AD.[1] The hundreds of individual figures range in complexity from simple lines to stylized hummingbirds, spiders, monkeys, fish, sharks, orcas, llamas, and lizards.

    Above is the description of Nazca Lines from Wikipedia. Recently scientists found out that those lines form many crosses. Do those crosses have something to do with the Christian religion? Scientists are curious about this. But at first, they want to figure out how many crosses are there. So they took a huge picture of Nazca area from the satellite, and they need you to write a program to count the crosses in the picture.

    To simplify the problem, we assume that the picture is an N*N matrix made up of 'o' and '#', and some '#' can form a cross. Here we call three or more consecutive '#' (horizontal or vertical) as a "segment".

    The definition of a cross of width M is like this:

    1) It's made up of a horizontal segment of length M and a vertical segment of length M.
    2) The horizontal segment and the vertical segment overlap at their centers.
    3) A cross must not have any adjacent '#'.
    4) A cross's width is definitely odd and at least 3, so the above mentioned "centers" can't be ambiguous.
    For example, there is a cross of width 3 in figure 1 and there are no cross in figure 2 ,3 and 4.



    You may think you find a cross in the top 3 lines in figure 2.But it's not true because the cross you find has a adjacent '#' in the 4th line, so it can't be called a "cross". There is no cross in figure 3 and figure 4 because of the same reason.
     
    Input
    There are several test cases.
    In each test case:
    The First line is a integer N, meaning that the picture is a N * N matrix ( 3<=N<=50) .
    Next N line is the matrix.
    The input end with N = 0
     
    Output
    For each test case, output the number of crosses you find in a line.
     
    Sample Input
    4 oo#o o### oo#o ooo# 4 oo#o o### oo#o oo#o 5 oo#oo oo#oo ##### oo#oo oo##o 6 ooo#oo ooo##o o##### ooo#oo ooo#oo oooooo 0
     
    Sample Output
    1 0 0 0
     
    Source

    比較恶心的模拟题。


    代码例如以下:(模拟)

    #include <cstdio>
    #include <cstring>
    const int MAXN = 57;
    int main()
    {
        char map[MAXN][MAXN];
        int n;
        int i, j, k;
        int sum;
        while(scanf("%d",&n) && n)
        {
            sum = 0;//总个数
            memset(map,0,sizeof(map));
            for(i = 1; i <= n; i++)
            {
                scanf("%s",map[i]);
            }
            int cont = 0;
            int t;//每个段落的数量
            int tt = 0;//记录连续的#的中间位置
            int up = 0, down = 0;//记录上下段是否符合
            int pos = 0;//记录连续的#開始的地方
            for(i = 2; i <= n; i++)//直接从第二行開始找
            {
                cont = up = down = 0;
                for(j = 0; j < n; j++)
                {
                    up = down = 0;
                    if(map[i][j]=='#')//寻找连续#的个数
                        cont++;
                    if(cont == 1)
                        pos = j;
                    if(j == n-1 || map[i][j] != '#')
                    {
                        if(cont % 2 == 0)
                        {
                            cont= 0;
                            continue;//连续的为偶数个。不符合
                        }
                        else
                        {
                            if(cont == 1)//仅仅有一个不能组成十字架
                            {
                                cont = 0;
                                continue;
                            }
                            tt = pos + cont/2;//中间位置
                            t = cont/2;//每个段落的数量
                            int c1 = 0, c2 = 0;
                            for(k = i-1; ; k--)//从中间向上寻找连续的#
                            {
                                if(map[k][tt]=='#' && map[k][tt-1]!='#' && map[k][tt+1]!='#')
                                {
                                    c1++;
                                    if(c1 == t && map[k-1][tt]!='#')
                                    {
                                        up = 1;
                                        break;
                                    }
                                }
                                else
                                    break;
                                
                            }
                            for(k = i+1; ; k++)//从中间向下寻找连续的#
                            {
                                if(map[k][tt]=='#' && map[k][tt-1]!='#' && map[k][tt+1]!='#')
                                {
                                    c2++;
                                    if(c2 == t && map[k+1][tt]!='#')
                                    {
                                        down = 1;
                                        break;
                                    }
                                }
                                else 
                                    break;
                            }
                            int flag = 0;
                            for(k = pos; k < tt; k++)//寻找左段是否符合
                            {
                                if(map[i-1][k]=='#' || map[i+1][k]=='#')
                                    flag = 1;
                            }
                            for(k = tt+1; k <= tt+t; k++)//寻找右段是否符合
                            {
                                if(map[i-1][k]=='#' || map[i+1][k]=='#')
                                    flag = 1;
                            }
                            if(up == 1 && down == 1 && flag == 0)
                                sum+=1;
                        }
                        cont = 0;
                    }    
                }
            }
            printf("%d
    ",sum);
        }
        return 0;
    }
    /*
    7
    0#000#0
    ###0###
    0#000#0
    0000000
    00#0000
    0###000
    00#0000
    7
    o#ooo#o
    ###o###
    o#o#o#o
    ooo#ooo
    o#####o
    ooo#o#o
    ooo#ooo
    11
    ooooo#ooooo
    oo#oo#oo#oo
    o###o#o###o
    oo#oo#oo#oo
    ooooo#ooooo
    ###########
    ooooo#ooooo
    oo#oo#oo#oo
    o###o#o###o
    oo#oo#oo#oo
    ooooo#ooooo
    */


    再贴一段别人的DFS代码:

    #include<iostream>
    #include<stdio.h>
    using namespace std;
    char matrix[55][55];
    int n;
    bool dfs(int x,int y)
    {
        if(matrix[x][y]=='o')
            return false;
        int len1=0,len2=0,len3=0,len4=0;
        bool flag=false;
        for(int i=x-1; i>=0; i--)
        {
            if(matrix[i][y]=='#')
            {
                len1++;
                if(matrix[i][y-1]=='#'||matrix[i][y+1]=='#')
                {
                    flag=true;
                }
            }
            else
            break;
        }
        if(len1<1||flag)
            return false;
        flag=false;
        for(int i=x+1; i<n; i++)
        {
            if(matrix[i][y]=='#')
            {
                len2++;
                if(matrix[i][y-1]=='#'||matrix[i][y+1]=='#')
                    flag=true;
            }
            else
            break;
        }
        if(len2!=len1||flag)
            return false;
        flag=false;
        for(int j=y-1; j>=0; j--)
        {
            if(matrix[x][j]=='#')
            {
                len3++;
                if(matrix[x-1][j]=='#'||matrix[x+1][j]=='#')
                    flag=true;
            }
            else
            break;
        }
        if(len3!=len1||flag)
            return false;
        flag=false;
        for(int j=y+1; j<n; j++)
        {
            if(matrix[x][j]=='#')
            {
                len4++;
                if(matrix[x-1][j]=='#'||matrix[x+1][j]=='#')
                    flag=true;
            }
            else break;
        }
        if(len4!=len1||flag)
            return false;
        return true;
    }
    int main()
    {
        while(scanf("%d",&n),n)
        {
            for(int i=0; i<n; i++)
            {
                for(int j=0; j<n; j++)
                    cin>>matrix[i][j];
            }
            int ans=0;
            for(int i=0;i<n;i++)
            {
                for(int j=0;j<n;j++)
                {
                    if(dfs(i,j))
                    ans++;
                }
            }
            printf("%d
    ",ans);
        }
        return 0;
    }
    


  • 相关阅读:
    SqlServer 数据库同步的两种方式 (发布、订阅),主从数据库之间的同步
    Haproxy+Heartbeat 高可用集群方案操作记录
    HAProxy+Keepalived高可用负载均衡
    Centos 6/7 忘记root密码处理方法
    Centos 7配置nginx反向代理负载均衡集群
    各种官网系统镜像文件
    Tomcat通过Redis实现session共享的完整部署记录
    ELK平台搭建及日志监控
    快速搭建ELK日志分析系统
    idea各种快捷键
  • 原文地址:https://www.cnblogs.com/wgwyanfs/p/7060835.html
Copyright © 2011-2022 走看看