习题 4-2 Squares UVa 201

来源:互联网 发布:万达电商 网络没说过 编辑:程序博客网 时间:2024/05/29 14:20

题目大意:

n 行n列的小黑点,有m条线段连接其中的一些黑点,统计连成了个正方形(每种边长分别统计)。

#include<stdio.h>#include<string.h>#define maxn 100int H[maxn][maxn], V[maxn][maxn];int main(){int n, m;int kcase = 0;//freopen("C:\\Users\\zhangwei\\Desktop\\input.txt","r",stdin);while(scanf("%d%d",&n, &m) == 2){memset(H, 0, sizeof(H));memset(V, 0, sizeof(V));char ch;int a, b;for(int i = 1; i <= m; i++ ){getchar();//除去每组数据之间的换行符scanf("%c%d%d",&ch,&a,&b);if(ch == 'H') H[a][b] = 1;else V[b][a] = 1;}if(kcase++)printf("\n**********************************\n\n");printf("Problem #%d\n\n",kcase);int len;int count, flag, sum = 0;for(len = 1; len <= n-1; len++ ){//每个长度依次统计count = 0, flag = 0;//count 统计每条边后把值加给sum 后置 0(统计每一条边)for(int i = 1; i+len <= n; i++ ){//该长度下 i ,j 应该满足的条件for(int j = 1; j +len <= n; j++ ){flag = 1;//下面是判断该边下长横边与竖边是否都存在for(int k = j; k < j+len; k++ ){//有一条边不存在就退出if(!H[i][k] || !H[i+len][k]){flag = 0;break;}}for(int p = i; p < i+ len; p++ ){if(!V[p][j] || !V[p][j+len]){flag = 0;break;}}count += flag;}}sum += count;if(count)printf("%d square (s) of size %d\n",count, len);}if(!sum)printf("No completed squares can be found.\n");}return 0;}

注意:
这题的关键是用两个分别表示水平线段(横边)和竖直线段(竖边)的数组,该边存在与否就看当前H 或者 V是否存在(主要靠想象)。  例如 H[2][1] = 1; 表示 以 (2,1) (2,2)为顶点的横边存在。V[2][1] =1 表示 以(2,1)(3,1)
为顶点的竖边存在。依次 统计每种边长正方形个数  直到 边长为 n-1统计完

还有一点就是:测试时候 一定不要在数据末尾多空白符(尤其是涉及有字符变量输入的时候)

这一题因为 文件中存在多余的空白符 整了半天。

原创粉丝点击