此题曾犯过的错误:好像也没有什么可以肯定能避免的错误,犯的一个比较大的错误应该是不可避免必须得去调试才能调试的出来的错误。
但是非常遗憾的是,虽然答案是对的,但是这个题超时了。具体原因我也不知道。
可能是一开始的思路就不是很正确,即如何存储图这个东西(看完了后面的图再来看着个吧)。
先把代码贴上来:
#include<cstdio> #include<cstring> using namespace std; const int maxn=20;//最多有9个点,那么最多需要max=17 char dots[maxn][maxn]; struct have_edge { int row;//从这个点开始的横向的边 int col;//纵 }edge[maxn][maxn]; int num_dot,num_line,kase=0; bool initial() { memset(dots,1,sizeof(dots)); memset(edge,0,sizeof(edge)); if(!(scanf("%d%d",&num_dot,&num_line)==2)) return false; if(kase) { printf("\n**********************************\n\n"); } printf("Problem #%d\n\n",++kase); for(int i=0;i<num_line;i++) { char A[3]; int x1,x2; scanf("%s%d%d",A,&x1,&x2); if(A[0]=='H') { edge[x1][x2].row=1;//x1 x2往右面有边 //printf("%d %d往右面有边\n",x1,x2); } else if(A[0]=='V') { edge[x2][x1].col=1;//x1 x2往下面有边 //printf("%d %d往下面有边\n",x1,x2); } } } int count(int n) { int cnt=0; for(int i=1;i<=num_dot-n;i++) { for(int j=1;j<=num_dot-n;j++) { //printf("%d%d点的边的情是",i,j); int flag=0; for(int k=0;k<n;) { //printf("%d%d%d%d\n",edge[i][k+j].row,edge[i+n][k+j].row,edge[k+i][j].col,edge[i+k][j+n].col); if(edge[i][j+k].row==1&&edge[i+n][j+k].row==1&&edge[i+k][j].col==1&&edge[i+k][j+n].col==1)//上横 { //printf("ok"); k++; continue; } else { flag=1; break; } } if(!flag) { //printf("%d%d点有以%d为边的正方形\n",i,j,n); cnt++; } } } return cnt; } int main() { #ifdef local freopen("input.txt","r",stdin); freopen("output.txt","w",stdout); #endif while(initial()) { for(int i=1;i<num_dot;i++)//最多只可能有num_dot-1条边的正方形 { int x=count(i); if(!x) { if(i==1) { printf("No completed squares can be found.\n"); } break; } else printf("%d square (s) of size %d\n",x,i); } } return 0; }