UVA-201 小正方形(枚举)

题意:给定一个n*n的小黑点构成的正方形,还有m条线段用来链接这些黑点,问所有连线能构成多少个正方形(每种边长分别统计)。

思路:因为题目给的n范围略小,所以用了枚举的方法,分别用两个三维数组[行][起点][终点],列对应[列][起点][终点]表示图里的点之间是否有连线,如果第一行点1~点2有连线,点2到点3有连线,即:h[1][1][2]=h[1][2][3]=h[1][1][3]=1;然后从变长为1的小正方形搜,从上到下,从左到右,最后输出结果,注意格式要求。

#include <bits/stdc++.h>
using namespace std;
/*freopen("in.txt","r",stdin);
    freopen("out.txt","w",stdout);*/
#define ll long long
#define maxc 10010
#define mod 7
int h[20][20][20];//横
int s[20][20][20];//竖
int p(int n,int m){
    int sum=0;
    for(int i=1;i<m;i++){
        for(int j=1;j<=m-n;j++){
            if(h[i][j][j+n]==1&&h[i+n][j][j+n]==1&&s[j][i][i+n]==1&&s[j+n][i][i+n]==1)
                sum++;
        }
    }
    return sum;
}
int main()
{
    int n;
    int cs=0;
    /*freopen("in.txt","r",stdin);
    freopen("out.txt","w",stdout);*/
    while(scanf("%d",&n)==1){
        cs++;
        if(cs!=1)
            printf("\n**********************************\n\n");
        memset(h,0,sizeof(h));
        memset(s,0,sizeof(s));
        int t;
        cin>>t;
        int a,b;
        char c;
        while(t--){
            cin>>c>>a>>b;
            if(c=='H'){
                h[a][b][b+1]=1;
            }
            else
                s[a][b][b+1]=1;
        }
        int k;
        for(int i=1;i<=n;i++){
            for(int j=1;j<n;j++){
                k=j;
                while(h[i][k][k+1]){
                    h[i][j][k+1]=1;
                    k++;
                }
            }
        }
        for(int i=1;i<=n;i++){
            for(int j=1;j<n;j++){
                k=j;
                while(s[i][k][k+1]){
                    s[i][j][k+1]=1;
                    k++;
                }
            }
        }
        printf("Problem #%d\n\n",cs);
        int ans[10];
        int sum=0;
        for(int i=1;i<=n;i++){
            ans[i]=p(i,n);
            sum+=ans[i];
        }
        if(sum==0)
            printf("No completed squares can be found.\n");
        else{
            for(int i=1;i<=n;i++){
                if(ans[i]!=0)
                    printf("%d square (s) of size %d\n",ans[i],i);
            }
        }
    }
    return 0;
}


版权声明:本文为qq_40894594原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。