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 |
我认为直接贴代码不如写点提示实在In Reply To:AC了的程序,仅供参考 Posted by:A861223 at 2006-08-23 22:17:15 > #define maxn 33 > #include<string.h> > #include<stdio.h> > int cover[maxn*maxn],link[maxn*maxn]; > int n,m,k,num,f[maxn*maxn][maxn*maxn],d[maxn][maxn],use[maxn][maxn]; > void task1() > {int t,i,j,x,y; > scanf("%d %d %d",&n,&m,&k); > memset(f,0,sizeof(f));memset(d,0,sizeof(d));memset(use,0,sizeof(use)); > for (i=1;i<=k;i++) > { > scanf("%d %d",&y,&x); > use[x][y]=1; > } > num=0; > for (i=1;i<=n;i++) > for (j=1;j<=m;j++) > if (use[i][j]==0) {num+=1;d[i][j]=num;}; > for (i=1;i<=n;i++) > for (j=1;j<=m;j++) > if (use[i][j]==0) > { t=d[i][j]; > if (i-1>=1&&use[i-1][j]==0) f[t][d[i-1][j]]=1; > if (j-1>=1&&use[i][j-1]==0) f[t][d[i][j-1]]=1; > if (i+1<=n&&use[i+1][j]==0) f[t][d[i+1][j]]=1; > if (j+1<=m&&use[i][j+1]==0) f[t][d[i][j+1]]=1; > } > } > int find(int i) > { int b,q,z; > z=0; > for(b=1;b<=num;b++) > if (f[i][b]==1&&cover[b]==0) > { > q=link[b];link[b]=i;cover[b]=1; > if (q==0||find(q)==0) return(z); > link[b]=q; > } > z=1; > return(z); > } > void maintask() > {int i; > for (i=1;i<=num;i++) > { > memset(cover,0,sizeof(cover)); > find(i); > } > } > void task2() > {int i,z; > z=0; > > for (i=1;i<=num;i++) > if (link[i]==0) > {z=1;break;} > > if (z==1) printf("NO\n"); > else printf("YES\n"); > } > void main() > { > task1(); > num=n*m-k; > maintask(); > task2(); > } Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator