您的位置:首页 > 其它

习题4-2 正方形 UVa201

2016-11-01 10:28 405 查看
算法竞赛入门经典(第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;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: