Online Judge | Problem Set | Authors | Online Contests | User | ||||||
---|---|---|---|---|---|---|---|---|---|---|
Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest |
参考前面的discussIn Reply To:为什么老是worry answer 提示下拉 Posted by:try88 at 2005-05-31 18:35:07 > > #include<stdio.h> > #include<malloc.h> > #include<stdlib.h> > > typedef struct _WALLS > { > int nStartx; > int nStarty; > > int nEndx; > int nEndy; > }WALLS; > > > void Zeros(int **a,int nRow,int nColumn) > { > int n,m; > for(n=0;n<=nRow;n++) /*m为列,即是x轴*/ > { > for(m=0;m<=nColumn;m++) /*n为行,即是y轴*/ > { > a[n][m]=0; > } > } > } > > > int PointInWhichWalls(WALLS *pWalls,int nWalls ,int n,int m) > { > int i; > for(i=0;i<nWalls;i++) > { > if( pWalls[i].nStartx<=m && m<=pWalls[i].nEndx && n==pWalls[i].nStarty) > return i; > } > return 0; > } > > > int GetBadWallIndex(int *pnBadWall,int nWalls,WALLS *pWalls) > { > int max=0; > int i; > int mm=0; > for(i=0;i<nWalls;i++) > { > if (pnBadWall[i]>max) > { > max=pnBadWall[i]; > mm=i; > } > } > > for(i=0;i<nWalls;i++) > { > if (pnBadWall[i]==max) > { > if( (pWalls[i].nEndx-pWalls[i].nStartx) > (pWalls[mm].nEndx-pWalls[mm].nStartx) ) > mm=i; > } > } > > return mm; > } > > > int main() > { > > int i,j; > int n,m; > > int tmp; > > int **a; > int k; > int nTime; > int nWalls; > WALLS *pWalls; > int *pnBadWall; > > /* int *pnResult; */ > > int nMaxColumn=0; > int nMaxRow=0; > > int nColumnCount=0; > int nDesWall; > int flag=0; > > int nResult=0; > > > /* 输入循环次数 */ > scanf("%d",&nTime); > /* pnResult=(int *)malloc(sizeof(int)*nTime); > for(i=0;i<nTime;i++) > { > pnResult[i]=0; > } > */ > for(i=0;i<nTime;i++) > { > scanf("%d %d",&nWalls,&k); > > pWalls=(WALLS *)malloc(sizeof(WALLS)*nWalls); > pnBadWall=(int *)malloc(sizeof(int)*nWalls); > > /* 输入围墙 */ > for(j=0;j<nWalls;j++) > { > scanf("%d %d %d %d", > &pWalls[j].nStartx, > &pWalls[j].nStarty, > &pWalls[j].nEndx, > &pWalls[j].nEndy); > > if(pWalls[j].nStartx > pWalls[j].nEndx) > { > tmp=pWalls[j].nStartx; > pWalls[j].nStartx=pWalls[j].nEndx; > pWalls[j].nEndx=tmp; > } > > /* 取出墙的最大列和行 */ > if(pWalls[j].nEndx>nMaxColumn) > nMaxColumn=pWalls[j].nEndx; > > if(pWalls[j].nStarty>nMaxRow) > nMaxRow=pWalls[j].nStarty; > > pnBadWall[j]=0; > } > > /* 动态构造平面图 */ > a=(int **)malloc(sizeof(int *)*(nMaxRow+1)); > for(j=0;j<=nMaxRow;j++) > { > a[j]=(int *)malloc(sizeof(int)*(nMaxColumn+1)); > } > /* 初始化平面图为0 */ > Zeros(a, nMaxRow, nMaxColumn); > > /* 在平面图上建墙 */ > for(j=0;j<nWalls;j++) > { > for(m=pWalls[j].nStartx;m<=pWalls[j].nEndx;m++) > { > a[pWalls[j].nStarty][m]=1; > } > } > > do > { > flag=0; > > /*------------------------------------------- > 查看打印值 > printf("\n-------------------\n"); > for(n=0;n<=nMaxRow;n++) > { > for(m=0;m<=nMaxColumn;m++) > { > printf("%d ",a[n][m]); > } > printf("\n"); > } > -------------------------------------------*/ > > /* 逐列循环扫面墙数 */ > for(m=0;m<=nMaxColumn;m++) > { > nColumnCount=0; > for(n=0;n<=nMaxRow;n++) > { > if(a[n][m]==1) > nColumnCount++; > } > > /* 如墙数大于传墙能力k */ > if(nColumnCount>k) > { > /* 记录下次要循环再扫描 */ > flag=1; > > for(n=0;n<=nMaxRow;n++) > { > if(a[n][m]==1) > { > /* 找出墙点所在的墙块 */ > /* 记录撞墙的次数的数组++ */ > nDesWall=PointInWhichWalls(pWalls,nWalls,n,m); > pnBadWall[nDesWall]++; > } > } > } > else if(flag!=1) > { > flag=0; > } > } > > if(flag==1) > { > /* 找出被撞的最多的那块墙 */ > nDesWall=GetBadWallIndex(pnBadWall,nWalls,pWalls); > > /* 在平面图上把墙去掉 */ > for(m=pWalls[nDesWall].nStartx; m<=pWalls[nDesWall].nEndx; m++) > { > a[ pWalls[nDesWall].nStarty ][m]=0; > } > > /* 记录撞墙的数组重新初始化为0 */ > for(j=0;j<nWalls;j++) > { > pnBadWall[j]=0; > } > > nResult++; > /*pnResult[i]++;*/ > } > > } while(flag); > > printf("%d\n",nResult); > > nResult=0; > > Zeros(a, nMaxRow, nMaxColumn); > free(pWalls); > free(pnBadWall); > > for(j=0;j<=nMaxRow;j++) > { > free(a[j]); > } > free(a); > } > > /* > for(i=0;i<nTime;i++) > { > printf("%d\n",pnResult[i]); > } > free(pnResult);*/ > > return 0; > } Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator