UVa201 Squares

一个儿童棋盘游戏,包含了由点组成的正方形矩阵,由线段连接了一些相邻的点。游戏的一个环节是,要求玩家数出由这些线段所形成的特定大小的正方形有多少个。例如,按下图所示,有 3 个正方形,其中大小为 1 的有 2 个,大小为 2 的有 1 个。正方形的 “大小” 是指构成它的一条边的线段数。

正方形游戏图示

你的任务是编写程序,自动对全部可能的正方形计数。

输入

输入包含了多个游戏棋盘。每个棋盘包含了 n^2 个点的正方形矩阵 (其中 2 ≤ n ≤ 9),以及一些起连接作用的横向或纵向的线段。棋盘的的 n^2 个点和 m 条连接线段,格式如下:

第 1 行:n,表示矩阵中单行或单列的点的数目
第 2 行:m,表示连接线段的数目
接下来的 m 行,每行是以下两种格式之一:
(1) H i j 形式,表示第 i 行的横向线段,连接了第 j 列的点和它右边的第 j + 1 列的点;
(2) V i j 形式,表示第 i 列的纵向线段,连接了第 j 行的点和它下方的第 j + 1 行的点。

样例输入数据的第 1 组,对应于上面的图示棋盘。

输出

对于每组测试数据,输出 Problem #1, Problem #2 等标识,并输出棋盘上的各种大小的正方形数目,按正方形由小到大的顺序排列。如果不存在任何大小的正方形,则打印相应的提示消息。将各组测试数据以一行星号间隔,星号上下方各有一个空行。请参见示例的格式。

示例输入

4
16
H 1 1
H 1 3
H 2 1
H 2 2
H 2 3
H 3 2
H 4 2
H 4 3
V 1 1
V 2 1
V 2 2
V 2 3
V 3 2
V 4 1
V 4 2
V 4 3
2
3
H 1 1
H 2 1
V 2 1

示例输出

Problem #1

2 square (s) of size 1
1 square (s) of size 2

**********************************

Problem #2

No completed squares can be found.


解答:


#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
int mapr[20][20],mapd[20][20],n,t;
int can(int x,int y,int d,char op)
{
    if(d==0) return 1;
    if(op=='r')
    {
        if(mapr[x][y]) return can(x,y+1,d-1,'r');
        else return 0;
    }
    else
    {
        if(mapd[x][y]) return can(x+1,y,d-1,'d');
        else return 0;
    }
}
bool find(int x,int y,int d)//防止重复,只按一个方向搜索; 
{
    if(!can(x,y,d,'r'))
    {
        return 0;
    }
    if(!can(x,y,d,'d'))
    {
        return 0;
    }
    if(!can(x+d,y,d,'r'))
    {
        return 0;
    }
    if(!can(x,y+d,d,'d'))
    {
        return 0;
    }
    return 1;
}
int main()
{
    //freopen("in.txt","r",stdin);
    while(scanf("%d",&n)==1)
    {
        t++;
        int m,ans[12],x,y;
        char op;
        scanf("%d",&m);
        memset(mapr,0,sizeof(mapr));
        memset(mapd,0,sizeof(mapd));
        memset(ans,0,sizeof(ans));
        while(m--)
        {
            cin>>op>>x>>y;
            if(op=='H') mapr[x][y]=1;
            else mapd[y][x]=1;
        }
        for(int i=1;i<=n;i++)
        {
            for(int j=1;j<=n;j++)
            {
                for(int k=1;k<=min(n-i,n-j);k++)
                {
                    if(find(i,j,k)) ans[k]++;
                }
            }
        }
        bool b=0;
        if(t>1) puts("\n**********************************\n");
        printf("Problem #%d\n\n",t);
        for(int i=1;i<=n-1;i++)
        {
            if(ans[i])
            {
                printf("%d square (s) of size %d\n",ans[i],i);
                b=1;
            }
        }
        if(!b) printf("No completed squares can be found.\n");
    }
 } 

 

 
posted @ 2019-07-02 11:07  satans  阅读(96)  评论(0编辑  收藏  举报