习题4-2 正方形 UVa201

来源:互联网 发布:h618b改端口 编辑:程序博客网 时间:2024/05/01 12:13

算法竞赛入门经典(第2版)第4章 函数和递归

题4-2 正方形  UVa201

感悟。

1、阅读书中题目,从网站下载英文原题,重点在看输出数据与格式。

2、粗看题目图形,很象安卓系统的锁屏码界面。

3、基本思路如下,第一次扫描边长为1正方形个数,第二次扫描边长为2正方形个数,

第n次扫描边长为n正方形个数。

4、扫描方式,逐行扫描,逐点判断,注意越界处理。

5、感觉此题比习题4-1 象棋 UVa1589 简单,当然,还没有开始编代码。

6、写着,感觉此题算法竞赛入门经典(第2版)》P40程序3-3蛇形填数的痕迹。

7、在处理水平线,竖直线觉得有些别扭,水平线数据(行,列),竖直线数据(列,行)。

8、程序编写,没法做到一次性成功,跟踪调试是免不了的,很快就把测试样例通过了。

9、提交AC,很久很久没有做到一次提交就AC了,很是高兴,看看时间2016-11-1。

附上AC代码,编译环境Dev-C++4.9.9.2

#include <stdio.h>
#include <string.h>

const int maxn=11;
int H[maxn][maxn],V[maxn][maxn];
int count[maxn]; //count[1]边长1个数;count[2]边长2个数。......

//行边长判别,row确定边起点的行位置,start确定边起点的列位置,k是边长
int Hline(int row,int start,int k){//一条水平边长有无判断,有返回1,无返回0
    int j;
    for(j=start;j<start+k;j++){
        if(H[row][j]==0)//无边
            return 0;
    }
    return 1;//有连续的边
}

//列边长判别,col确定边起点的列位置,start确定边起点的行位置,k是边长
int Vline(int col,int start,int k){// 一条竖直边长有无判断,有返回1,无返回0
    int j;
    for(j=start;j<start+k;j++){
        if(V[col][j]==0)
            return 0;
    }
    return 1;
}
 
int main(){
    int T=0;
    int n,m;
    int i,j,k;
    char s[2];
    int ans;
    int ansup,ansdown,ansleft,ansright;
    int print;
    while(scanf("%d%d",&n,&m)!=EOF){
        memset(H,0,sizeof(H));//初始化H数组
        memset(V,0,sizeof(V));//初始化V数组
        memset(count,0,sizeof(count));//初始化边计数。
        if(T>0)
            printf("\n**********************************\n\n");
        T++;
        for(k=0;k<m;k++){//连线读取
            scanf("%s%d%d",s,&i,&j);//用字符串来处理字符,直接读取字符会有很多问题,详见习题4-1象棋UVa1589的解答
            switch(s[0]){
                case 'H':
                    H[i][j]=1;
                    break;
                case 'V':
                    V[i][j]=1;
                    break;
            }
        }
        
        for(k=1;k<=n-1;k++){//边数扫描
            for(i=1;i<=n-k;i++){//行扫描
                for(j=1;j<=n-k;j++){//列扫描
                    ans=1;
                    ansup=Hline(i,j,k);//上水平边
                    ansdown=Hline(i+k,j,k);//下水平边
                    ansleft=Vline(j,i,k);//左竖直边
                    ansright=Vline(j+k,i,k);//右竖直边
                    ans=ans*ansup*ansdown*ansleft*ansright;
//                    printf("%d %d %d %d %d %d %d %d\n",ans,ansup,ansdown,ansleft,ansright,i,j,k);
                    if(ans)
                        count[k]++;
                }
            }
        }
        
        printf("Problem #%d\n\n",T);
        print=0;
        for(i=1;i<=8;i++)//打印统计数据
            if(count[i]>0){
                printf("%d square (s) of size %d\n",count[i],i);
                print=1;
            }
        if(print==0)
            printf("No completed squares can be found.\n");
    }
    return 0;
}




0 0
原创粉丝点击