#include //这个结构体有意思,描述的意义就多了一个维度 struct point { int h; int v; } xian[10][10]; /** * 功能:计算在指定 长=chang, 横=hen,竖=shu 情况下,有多少个正方形 * * @param chang * @param hen * @param shu * @return */ int jisuan(int chang, int hen, int shu) { //因为前面判断了,所以这里加上chang,肯定不会出界 int x1 = 0, x2 = 0, y1 = 0, y2 = 0; //挨个加上去,看看中间是不是全都有线存在 for (int i = 0; i < chang; i++) { x1 += xian[hen][shu + i].h; //开始行,是不是有线 x2 += xian[hen + chang][shu + i].h; //结束行,是不是有线 y1 += xian[hen + i][shu].v; //开始列,是不是有线 y2 += xian[hen + i][shu + chang].v; //结束列,是不是有线 } if (x1 + x2 + y1 + y2 == 4 * chang) return 1; else return 0; } int main() { int dian, n, kase = 1; char direction; int a, b; //第一行会给出这个正方形矩阵的每一行由n个点组成(2<=n <= 9) --->dian //第二行会给出要输入的边的数据 --->n while (scanf("%d%d", &dian, &n) == 2) { // 第一行不打印星星 if (kase != 1) printf("\n**********************************\n\n"); //正方形的数组进行初始化 for (int p = 1; p <= dian; p++) for (int q = 1; q <= dian; q++) { xian[p][q].h = 0; xian[p][q].v = 0; } while (n--)//输入全部数据 { getchar(); scanf("%c", &direction); // H or V if (direction == 'H') { scanf("%d%d", &a, &b); xian[a][b].h = 1; //表示:从a到b 存在一个水平的线 } else { scanf("%d%d", &a, &b); xian[b][a].v = 1; //表示:从b到a 存在一个垂直的线,注意这里是b,a,是反着的,注意看题,是这样给数据的!紫书这里说的不清晰。 } } printf("Problem #%d\n\n", kase++); int k, i, p, q, ji = 0; for (i = 1; i < dian; i++)// 几个长度的正方形? 比如边形为1,2,3的分别计算 { k = 0; //正方形计数器 for (p = 1; p <= dian; p++) //两层循环为遍历原始的正方形 for (q = 1; q <= dian; q++) { //如果超出了,就不要了,分别判断横向与纵向两种情况 if ((p + i) > dian || (q + i) > dian) break; //判断函数,在i=边形,p=横向,q=纵向,能否构成正方形? k += jisuan(i, p, q); } if (k != 0) { ji = 1; //找到答案,输出答案 printf("%d square (s) of size %d\n", k, i); } } //一个答案都没有~ if (ji == 0) printf("No completed squares can be found.\n"); } return 0; }