zoukankan      html  css  js  c++  java
  • HDU 1045 Fire Net

    题目链接

    题目意思:输入n,接下来为n行n列,X表示墙不能放置碉堡而且碉堡打不透,同行同列不能放两个碉堡(有x阻挡的除外)

    问:最多可以建立多少个碉堡。

    #include <cstdio>
    #include <cstring>
    #include <iostream>
    #include <algorithm>
    using namespace std;
    
    char str[20][20];
    struct node
    {
        int x,y;
    } a[20][20];
    
    int maps[20][20];
    int used[20];
    int vis[20],x,y;
    
    int finds(int u)
    {
        for(int i=1; i<=y; i++)
        {
            if(!vis[i]&&maps[u][i])
            {
                vis[i]=1;
                if(!used[i]||finds(used[i]))
                {
                    used[i]=u;
                    return 1;
                }
            }
        }
        return 0;
    }
    
    int main()
    {
        int n;
        while(scanf("%d",&n),n)
        {
            for(int i=1; i<=n; i++)
            {
                scanf("%s",str[i]+1);
            }
            x=y=0;
            for(int i=1; i<=n; i++)
            {
                for(int j=1; j<=n; j++)
                {
                    if(str[i][j]=='.')//对一排相邻的进行合并
                    {
                        if(j==1||str[i][j-1]=='X')
                        {
                            x++;
                        }
                        a[i][j].x=x;
                    }
                    if(str[j][i]=='.')//对一列相邻的进行合并
                    {
                        if(j==1||str[j-1][i]=='X')
                        {
                            y++;
                        }
                        a[j][i].y=y;
                    }
                }
            }
            memset(maps,0,sizeof(maps));
            for(int i=1; i<=n; i++)//建图。
            {
                for(int j=1; j<=n; j++)
                {
                    if(str[i][j]=='.')
                    {
                        int xx=a[i][j].x;
                        int yy=a[i][j].y;
                        maps[xx][yy]=1;
                    }
                }
            }
            memset(used,0,sizeof(used));
            int ans=0;
            for(int i=1; i<=x; i++)
            {
                memset(vis,0,sizeof(vis));
                if(finds(i))
                {
                    ans++;
                }
            }
            printf("%d
    ",ans);
        }
    
        return 0;
    }
  • 相关阅读:
    京东css三角形做法
    css三角
    java 优势和劣势
    windows常用命令
    25 abstract 抽象
    24static 和final关键字之final
    面试题----static
    定义变量在前和定义变量在后
    java注解
    23static 和final关键词 之static 和运行顺序
  • 原文地址:https://www.cnblogs.com/mengzhong/p/4717235.html
Copyright © 2011-2022 走看看