《演算法競賽入門經典》習題4-2 正方形
阿新 • • 發佈:2018-12-15
有n行n列(2<=n<=9)的小黑點,還有m條線段連線其中的一些黑點。統計這些線段連成了多少正方形。(每種邊長分別統計)。
行從上到下編號為1~ n,列從左到右編號為1~n。邊用H i j和V i j表示,分別代表(i,j)-(i,j+1)和(i,j)-(i+1,j)。
(具體題目:https://blog.csdn.net/ramay7/article/details/50363125)
#include<cstring> #include<iostream> #include<cstdio> using namespace std; int h[11][11],v[11][11]; int main() { int n,m,t=0,x,y; char a; while(scanf("%d%d",&n,&m)!=EOF) { getchar(); //防止把回車當成字元 memset(h,0,sizeof(h)); memset(v,0,sizeof(v)); for(int i=0;i<m;i++) { scanf("%c%d%d",&a,&x,&y); getchar(); //防止把回車當字元 if(a=='H') h[x][y]=1; //記錄線段 else v[x][y]=1; } if(t++) printf("\n**********************************\n\n"); printf("Problem #%d\n\n",t); int size,cnt; int flag=0; //判斷有沒有正方形 for(size=1;size<n;size++) //邊長最大為n-1 { cnt=0; for(int i=1;i<=n-size;i++) //因為i+size<=n { //並且每次都從左上角開始 for(int j=1;j<=n-size;j++) //因為j+size<=n { int is=1; for(int jj=j;jj<j+size;jj++) //判斷正方形上下有沒有邊 { if(!h[i][jj]||!h[i+size][jj]) is=0; } for(int ii=i;ii<i+size;ii++) //判斷正方形左右有沒有邊 { if(!v[ii][j]||!v[ii][j+size]) is=0; } if(is) cnt++; //如果有正方形,個數加一 } } if(cnt) { flag=1; //記錄有正方形 printf("%d square (s) of size %d\n",cnt,size); } } if(!flag) printf("No completed squares can be found.\n"); } return 0; }
(どうして私は毎日お腹がすいているのですか。)