BBS联赛作品A5000
实现方法
A1.
#include "conio.h" #include "stdio.h" #include "stdlib.h" #include "string.h" int *policeman(int *in,int maxline); int *readdata(int *maxline); void writedata(int *out); void main() { int *xx,*yy,maxline; xx=readdata(&maxline); //读入数据(第一个数为总人数,依次后推) yy=policeman(xx,maxline); //处理数据 writedata(yy); //写入数据(第一个数为总人数,依次后推) getch(); } int *policeman(int *in,int maxline) { int min,*man,i,j,k=0; int *out,flag,man1,man2; out=(int*)malloc((in[0]+2)/2*sizeof(int)); man=(int*)malloc((in[0]+1)*sizeof(int)); memset((void*)out,0,(in[0]+2)/2*sizeof(int)); while(1) { memset((void*)man,0,(in[0]+1)*sizeof(int)); //清零 flag=0; for(i=1;i<maxline*2+1;i++) //对每人出现次数计数 { if(in[i])flag=1; man[in[i]]++; } if(!flag)break; //当没人时跳出 for(min=in[0],i=1;i<=in[0];i++) //找出最小项(出现次数最少) if(min>man[i]&&man[i]>=1) { min=man[i]; j=i; } for(i=1;i<maxline*2+1;i++) //找出此人出现的第一个地方 if(in[i]==j)break; k=(i-1)/2*2; man1=in[k+1]; man2=in[k+2]; out[out[0]+1]=man1; //写入输出数组 out[out[0]+2]=man2; for(i=1;i<maxline*2+1;i++) //找出所有含这一对警察的所有项并清零 if(in[i]==man1||in[i]==man2) { in[(i-1)/2*2+1]=0; in[(i-1)/2*2+2]=0; } out[0]+=2; } // free((void*)in); free((void*)man); //清除临时数组 return out; } int *readdata(int *maxline) { FILE *fp; int *in,num,i=1,buf; if(!(fp=fopen("schedule.in","r"))) { printf("file open error!\n"); getch(); exit(1); } fscanf(fp,"%d\n",&num); for(*maxline=0;!feof(fp)&&fscanf(fp,"%d %d\n",&buf,&buf);(*maxline)++); fclose(fp); in=(int*)malloc(((*maxline)*2+1)*sizeof(int)); in[0]=num; if(!(fp=fopen("schedule.in","r"))) { printf("file open error!\n"); getch(); exit(1); } fscanf(fp,"%d\n",&num); while(!feof(fp)) { fscanf(fp,"%d %d\n",&in[i],&in[i+1]); i+=2; } fclose(fp); return in; } void writedata(int *out) //输出数据 { FILE *fp; int line=out[0]/2; int i=0; if(!(fp=fopen("schedule.out","w"))) { printf("file open error!\n"); getch(); exit(1); } fprintf(fp,"%d\n",out[0]); printf("%d\n",out[0]); while(i<line) { fprintf(fp,"%d %d\n",out[i*2+1],out[i*2+2]); printf("%d %d\n",out[i*2+1],out[i*2+2]); i++; } // free((void*)out); fclose(fp); }
A2.
#include "stdio.h" #include "stdlib.h" #include "conio.h" //xx为n*n矩阵,用递归穷举求得钱数最多的方法,返回值为最大钱数 int money(int *xx,int n,int k,int i,int j) { int m=0,temp,L=1,dir,i2,j2; for(dir=0;dir<4;) { for(;L<=k;L++) { i2=i-(dir==0)*L+(dir==2)*L; j2=j+(dir==1)*L-(dir==3)*L; if(i2>=0&&i2<n&&j2>=0&&j2<n&&xx[i2*n+j2]>xx[i*n+j]) break; } if(L<=k) { temp=money(xx,n,k,i2,j2); if(m<temp)m=temp; } if(L<k)L++; else { L=1; dir++; } } return m+xx[n*i+j]; } void main() { int i,j,n,m,k,num,*xx,answer; FILE *fp,*fp2; if(!(fp=fopen("hopscotch.in","r"))) { printf("file open error!"); getch(); exit(1); } if(!(fp2=fopen("hopscotch.out","w"))) { printf("file open error!"); getch(); exit(1); } fscanf(fp,"%d\n\n",&m); //输入 for(num=0;num<m;num++) { fscanf(fp,"%d %d\n",&n,&k); xx=(int*)malloc(n*n*sizeof(int)); for(i=0;i<n;i++) { for(j=0;j<n;j++) fscanf(fp,"%d ",xx+n*i+j); fscanf(fp,"\n"); } answer=money(xx,n,k,0,0); //调用函数 printf("%d\n\n",answer); //输出 fprintf(fp2,"%d\n\n",answer); fscanf(fp,"\n"); free((void*)xx); } getch(); }
A3.
#include "stdlib.h" #include "string.h" #include "stdio.h" #include "conio.h" //用递归的方法计算从x到y的方法数*k,并对各节点计数存入yy中 void a(int *xx,int *flag,int n,int x,int y,int *yy,int *k) { int i,j,*flag2,l; flag2=(int*)malloc(n*sizeof(int)); for(l=0;l<n;l++)flag2[l]=flag[l]; for(i=0;i<n;i++) { if(xx[x*n+i]&&(!flag[i]||i==y)) { if(i==y) { k[0]++; for(j=0;j<n;j++) { yy[j]+=flag[j]; } } else { flag[i]=1; a(xx,flag,n,i,y,yy,k); for(l=0;l<n;l++)flag[l]=flag2[l]; } } } free(flag2); } //找出camera存入camera数组,返回camera数目 int find(int *xx,int n,int *camera) { int x,y; int i,j,num=0,k; int *flag,*yy; flag=(int*)malloc(n*sizeof(int)); yy=(int*)malloc(n*sizeof(int)); for(x=0;x<n-1;x++) { for(y=x+1;y<n;y++) { memset(flag,0,n*sizeof(int)); memset(yy,0,n*sizeof(int)); k=0; flag[x]=flag[y]=2; a(xx,flag,n,x,y,yy,&k); if(k>0) for(i=0;i<n;i++) { if(yy[i]==k) //当从x->y的方法数等于yy[i]时表示必须经过i节点 { for(j=0;j<num;j++)if(i==camera[j])break; if(j>=num)camera[num++]=i; } } } } free(flag); free(yy); return num; } void main(void) { int *xx,*camera; int i,j,jj,k=0,n,m,num; char name1[20],name2[20],*name; FILE *fp,*fp2; if(!(fp=fopen("guide.in","r"))) //打开文件 {printf("open file error!\n");getch();exit(1);} if(!(fp2=fopen("guide.out","w"))) {printf("open file error!\n");getch();exit(1);} while(!feof(fp)) //每循环一次处理一组数据 { k++; fscanf(fp,"%d\n",&n); if(!n)break; xx=(int*)malloc(n*n*sizeof(int)); name=(char*)malloc(n*20); camera=(int*)malloc(n*sizeof(int)); memset(xx,0,n*n*sizeof(int)); memset(camera,0,n*sizeof(int)); for(j=0;j<n;j++) fscanf(fp,"%s",name+20*j); fscanf(fp,"%d\n",&m); for(j=0;j<m;j++) //用邻接矩阵建立图 { fscanf(fp,"%s %s",name1,name2); for(i=0;i<n;i++) if(strcmp(name1,name+20*i)==0)break; for(jj=0;jj<n;jj++) if(strcmp(name2,name+20*jj)==0)break; xx[i*n+jj]=xx[jj*n+i]=1; } num=0; num=find(xx,n,camera); if(num>0) //输出结果 { printf("City map #%d:%d camera(s) found\n",k,num); fprintf(fp2,"City map #%d:%d camera(s) found\n",k,num); for(i=0;i<num;i++) { printf("%s\n",name+20*camera[i]); fprintf(fp2,"%s\n",name+20*camera[i]); } printf("\n"); fprintf(fp2,"\n"); } free(xx); free(name); free(camera); } fclose(fp); fclose(fp2); getch(); }
我是白云黄鹤的会员,账号是wudanyu,在华中科技大学就读,因不知如何报名,所以就这样传上来了,请收录。
华中科技大学:吴旦昱4:19
//最让我感动的作品!
//感谢作者对大赛的支持和积极参与。由于作者没有报名而是直接参赛,
//所以临时分配了一个SN:A5000,这是一个特殊的号码 *_*
注:转载文章需注明来源:VCer.net 文章地址:http://vcer.net/2065.html
如果你觉得VCer.net不错,而且你愿意为VCer.net捐赠一元钱,那么点击后面的捐赠按钮吧:)
A B C D E