习题4-2 Squares UVA - 201
这道题我没做出来,主要是因为数据结构没想出来。我想的是用一整个图来存这个正方形,以及那些点的相互连接情况。但是想出来的结构都太繁琐了,而且错误率很高。最后在网上看了一个大佬的解法,很受启发,就写出来了。
他的解法没全存,而是分开横行和竖行存,两个一维数组,第i个元素表示是否i和i+1号元素相连接,相连就是1,不相连就是0。这样简单了很多,只需要遍历每个点,对每个点,再遍历所有的边长,就行了。其实和我想的算法几乎一样,只是我没想明白数据如何存储,但是他想明白了。
除了数据结构之外,这道题还卡我一个点,调了几十分钟bug:输入格式有两种,输入i行j列,和输入i列j行
#include <bits/stdc++.h>
#define N 15
using namespace std;
int h[N][N],v[N][N];
int main() {
int n,m,T=0,t1,t2;
char c;
while (scanf("%d%d",&n,&m)!=EOF) {
fill(h[0],h[0]+N*N,0);
fill(v[0],v[0]+N*N,0);
int flag=0;
getchar();
for (int i=0;i<m;i++) {
scanf("%c%d%d",&c,&t1,&t2);
getchar();
if (c=='H') h[t1][t2]=1;
else if (c=='V') v[t2][t1]=1;
}
if (T++) printf("\n**********************************\n\n");
printf("Problem #%d\n\n",T);
for (int len=1;len<=n;len++) {
int sum=0;
for (int i=1;i+len<=n;i++) {
for (int j=1;j+len<=n;j++) {
int cnt=1;
for (int k=0;k<len;k++) {
if (!h[i][j+k]||!h[i+len][j+k]) {cnt=0;break;}
if (!v[i+k][j]||!v[i+k][j+len]) {cnt=0;break;}
}
sum+=cnt;
}
}
if (sum) {
flag=1;
printf("%d square (s) of size %d\n",sum,len);
}
}
if (!flag) printf("No completed squares can be found.\n");
}
return 0;
}