2004 ACM-ICPC世界总决赛试题分析1-4

1
 
 
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
struct info
{
	int x,y,len,wait,dir;
};
const int MaxN=50;
const int MaxM=100;
const int MaxL=250;
const int Add[4][2]={-1,0,0,1,1,0,0,-1};
int N,cases,n,m,D,Rs,fin,sta,T,ex,ey;
int route[MaxN*MaxL];
int map[MaxL+1][MaxL+1];
int ants[MaxL+1][MaxL+1][4];
int list[MaxM];
info ant[MaxM];

void init()
{
	int i,j,k,t,x1,y1,x2,y2;
	scanf("%d%d%d",&n,&m,&D);
	x1=0;y1=0;Rs=0;
	for(i=0;i<n;i++)
	{
		scanf("%d%d",&x2,&y2);
		if(x1>x2) t=0;
		if(y1<y2) t=1;
		if(x1<x2) t=2;
		if(y1>y2) t=3;
		for(;x1!=x2||y1!=y2;)
		{
			route[Rs]=t;
			Rs++;
			x1+=Add[t][0];
			y1+=Add[t][1];
		}
	}
	fin=0;sta=0;
	for(i=0;i<=MaxL;i++)
		for(j=0;j<=MaxL;j++)
			for(k=0;k<4;k++)
				ants[i][j][k]=-1;
}

void work()
{
	bool ok;
	int i,j,x,y,d,p,tmp;
	int go[MaxM];
	memset(go,0,sizeof(go));
	ok=0;
	for(i=0;i<sta;i++) if(ant[i].x<0) ok++;
	for(i=0;i<sta;i++) if(ant[i].x>=0)
	{
		x=ant[i].x;y=ant[i].y;
		for(j=0;j<4;j++) if(ants[x][y][j]>=0)
		{
			tmp=ants[x][y][j];
			if(ant[tmp].wait>ant[i].wait || (ant[tmp].wait==ant[i].wait && ant[tmp].len>ant[i].len))
			{
				p=1;go[i]=1;ok++;
				break;
			}
		}
	}

	do{
		ok=0;
		for(i=0;i<sta;i++) if(!go[i] && ant[i].x>0)
		{
			d=map[ant[i].x][ant[i].y];
			x=ant[i].x+Add[d][0];y=ant[i].y+Add[d][1];
			if(ants[x][y][d]>=0&&go[ants[x][y][d]]==1)
			{
				go[i]=1;ok=1;
				continue;
			}
		}
	}while(ok);

	for(i=0;i<sta;i++) 
		if(!go[i]&&ant[i].x>=0)
		{
			ant[i].len++;ant[i].wait=0;
			ants[ant[i].x][ant[i].y][ant[i].dir]=-1;
		}
		else if(ant[i].x>=0)
			ant[i].wait++;
	for(i=0;i<sta;i++)
		if(!go[i]&&ant[i].x>=0)
		{
			x=ant[i].x;y=ant[i].y;
			if(x==100&&y==100&&i!=sta-1)
			{
				ants[100][100][map[100][100]]=i+1;
			}
			d=map[x][y];
			ant[i].x+=Add[d][0];ant[i].y+=Add[d][1];ant[i].dir=d;
			if(ant[i].x==ex&&ant[i].y==ey)
			{
				list[fin]=i;
				fin++;
				ant[i].x=-1;
			}
			else
				ants[ant[i].x][ant[i].y][d]=i;
		}
}

void write()
{
	int i;
	printf("Case %d:\n",cases);
	printf("Carl finished the path at time %d\n",ant[0].len+1);
	printf("The ants finished in the following order:\n");
	printf("%d",list[0]);
	for(i=1;i<m;i++)
		printf(" %d",list[i]);
	printf("\n");
	printf("The last ant finished the path at time %d\n",T+1);
	if(cases<N)
		printf("\n");
}

int main()
{
	int X,Y;
	scanf("%d",&N);
	for(cases=1;cases<=N;cases++)
	{
		init();
		X=100;Y=100;ex=-1;ey=-1;
		for(T=0;fin<m;T++)
		{
			if(T<Rs)
			{
				map[X][Y]=route[T];
				X+=Add[route[T]][0];Y+=Add[route[T]][1];
				if(T==Rs-1)
				{
					ex=X;ey=Y;
				}
			}
			if(T%D==0&&sta<m)
			{
				if(ants[100][100][map[100][100]]) ants[100][100][map[100][100]]=sta;
				ant[sta].x=100;ant[sta].y=100;
				ant[sta].len=0;ant[sta].wait=0;ant[sta].dir=map[100][100];
				sta++;
			}
			work();
		}
		write();
	}
	return 0;
}

2
#include<cstdio>
#include<math.h>
const double eps=1e-6;
int x[25],y[25],n,i,len,px,py,cases;
double ra,rb,r;
char dr;

bool check(double ox,double oy)
{
	int i,s;
	s=0;
	for(i=0;i<n;i++)
		if(x[i]>ox && ((y[i]>oy)^(y[i+1]>oy))) s++;
	if(s%2==0)
		return false;
	for(i=0;i<n;i++)
	{
		if((x[i]-ox)*(x[i]-ox) + (y[i]-oy)*(y[i]-oy)<(r-eps)*(r-eps))
			return false;
		if(x[i]==x[i+1] && ((y[i]>oy)^(y[i+1]>oy))&&fabs(x[i]-ox)<r-eps)
			return false;
		if(y[i]==y[i+1]&&((x[i]>ox)^(x[i+1]>ox))&&fabs(y[i]-oy)<r-eps)
			return false;
	}
	return true;
}

bool ok()
{
	int i,j;
	double di,dd,mx,my,dx,dy;
	for(i=0;i<n;i++) if(x[i]==x[i+1])
		for(j=0;j<n;j++) if(y[j]==y[j+1])
		{
			if(check(x[i]+r,y[j]+r)) return true;
			if(check(x[i]+r,y[j]-r)) return true;
			if(check(x[i]-r,y[j]+r)) return true;
			if(check(x[i]-r,y[j]+r)) return true;
		}
	for(i=0;i<n;i++)
		for(j=0;j<n;j++) if(x[i]==x[i+1])
		{
			di=fabs(x[j]-(x[i]+r));
			if(di<r)
			{
				dd=sqrt(r*r-di*di);
				if(check(x[i]+r,y[j]+dd)) return true;
				if(check(x[i]+r,y[j]-dd)) return true;
			}
			di=(fabs(x[j]-(x[i]-r)));
			if(di<r)
			{
				dd=sqrt(r*r-di*di);
				if(check(x[i]-r,y[j]+dd)) return true;
				if(check(x[i]-r,y[j]-dd)) return true;
			}
		}
		else
		{
			di=fabs(y[j]-(y[i]+r));
			if(di<r)
			{
				dd=sqrt(r*r-di*di);
				if(check(x[j]+dd,y[i]+r)) return true;
				if(check(x[j]-dd,y[i]+r)) return true;
			}
			di=fabs(y[j]-(y[i]-r));
			if(di<r)
			{
				dd=sqrt(r*r-di*di);
				if(check(x[j]+dd,y[i]-r)) return true;
				if(check(x[j]-dd,y[i]-r)) return true;
			}
		}

		for(i=0;i<n-1;i++)
			for(j=i+1;j<n;j++)
			{
				mx=(x[i]+x[j])/2.0;
				my=(y[i]+y[j])/2.0;
				di=sqrt((x[i]-mx)*(x[i]-mx) + (y[i]-my)*(y[i]-my));
				if(di>0&&di<r)
				{
					dd=sqrt(r*r-di*di);
					dx=(my-y[i])/di*dd;
					dy=(x[i]-mx)/di*dd;
					if(check(mx+dx,my+dy)) return true;
					if(check(mx-dx,my-dy)) return true;
				}
			}
			return false;
}

int main()
{
	while(scanf("%d",&n)&&n)
	{
		if(cases)
			printf("\n");
		px=0;py=0;
		for(i=1;i<=n;i++)
		{
			scanf("%d %c",&len,&dr);
			if(dr=='R')
				px+=len;
			if(dr=='L')
				px-=len;
			if(dr=='U')
				py+=len;
			if(dr=='D')
				py-=len;
			x[i]=px;
			y[i]=py;
		}
		ra=0;rb=999;
		while(rb-ra>eps)
		{
			r=(ra+rb)/2;
			if(ok())
				ra=r;
			else
				rb=r;
		}
		printf("Case Number %d radius is: %.2lf\n",++cases,r);
	}
	return 0;
}


3
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
const int MaxN=10+5;
char g1[MaxN][MaxN],g2[MaxN][MaxN],g3[MaxN][MaxN],g4[MaxN][MaxN],g5[MaxN][MaxN],g6[MaxN][MaxN];
int p1[MaxN][MaxN],p2[MaxN][MaxN],p3[MaxN][MaxN],p4[MaxN][MaxN],p5[MaxN][MaxN],p6[MaxN][MaxN];
int g[MaxN][MaxN][MaxN];
int n;

void init();
void work();
bool update_front();
bool update_left();
bool update_back();
bool update_right();
bool update_top();
bool update_bottom();

int main()
{
	for(;;)
	{
		scanf("%d",&n);
		if(n==0) break;
		init();
		work();
	}
	return 0;
}

void init()
{
	for(int i=0;i<n;++i)
		scanf("%s %s %s %s %s %s",g1[i],g2[i],g3[i],g4[i],g5[i],g6[i]);
}

void work()
{
	fill(p1[0],p1[n],0);fill(p2[0],p2[n],0);fill(p3[0],p3[n],0);
	fill(p4[0],p4[n],0);fill(p5[0],p5[n],0);fill(p6[0],p6[n],0);
	fill(g[0][0],g[n][0],-1);
	for(;;)
	{
		bool quit=true;
		if(update_front()) quit=false;
		if(update_left()) quit=false;
		if(update_back()) quit=false;
		if(update_right()) quit=false;
		if(update_top()) quit=false;
		if(update_bottom()) quit=false;
		if(quit) break;
	}
	int ans=n*n*n;
	for(int i=0;i<n;++i)
		for(int j=0;j<n;++j)
			for(int k=0;k<n;++k)
				if(g[i][j][k]==0) --ans;
	printf("Maximum weight: %d gram(s)\n",ans);
}

bool update_front()
{
	bool upd=false;
	for(int i=0;i<n;++i)
		for(int j=0;j<n;++j)
		{
			int &t=p1[i][j];
			char ch=g1[i][j];
			if(t==n) continue;
			int &val=g[n-t-1][j][i];
			if(val==0)
			{
				++t;
				upd=true;
			}
			else if(ch=='.')
			{
				val=0;
				++t;
				upd=true;
			}
			else if(val==-1)
			{
				val=ch-'A'+1;
				upd=true;
			}
			else if(val!=ch-'A'+1)
			{
				val=0;
				++t;
				upd=true;
			}
		}
		return upd;
}

bool update_left()
{
	bool upd=false;
	for(int i=0;i<n;++i)
		for(int j=0;j<n;++j)
		{
			int &t=p2[i][j];
			char ch=g2[i][j];
			if(t==n) continue;
			int &val=g[j][t][i];
			if(val==0)
			{
				++t;
				upd=true;
			}
			else if(ch=='.')
			{
				val=0;
				++t;
				upd=true;
			}
			else if(val==-1)
			{
				val=ch-'A'+1;
				upd=true;
			}
			else if(val!=ch-'A'+1)
			{
				val=0;
				++t;
				upd=true;
			}
		}
		return upd;
}

bool update_back()
{
	bool upd=false;
	for(int i=0;i<n;++i)
		for(int j=0;j<n;++j)
		{
			int &t=p3[i][j];
			char ch=g3[i][j];
			if(t==n) continue;
			int &val=g[t][n-j-1][i];
			if(val==0)
			{
				++t;
				upd=true;
			}
			else if(ch=='.')
			{
				val=0;
				++t;
				upd=true;
			}
			else if(val==-1)
			{
				val=ch-'A'+1;
				upd=true;
			}
			else if(val!=ch-'A'+1)
			{
				val=0;
				++t;
				upd=true;
			}
		}
		return upd;
}

bool update_right()
{
	bool upd=false;
	for(int i=0;i<n;++i)
		for(int j=0;j<n;++j)
		{
			int &t=p4[i][j];
			char ch=g4[i][j];
			if(t==n) continue;
			int &val=g[n-j-1][n-t-1][i];
			if(val==0)
			{
				++t;
				upd=true;
			}
			else if(ch=='.')
			{
				val=0;
				++t;
				upd=true;
			}
			else if(val==-1)
			{
				val=ch-'A'+1;
				upd=true;
			}
			else if(val!=ch-'A'+1)
			{
				val=0;
				++t;
				upd=true;
			}
		}
		return upd;
}

bool update_top()
{
	bool upd=false;
	for(int i=0;i<n;++i)
		for(int j=0;j<n;++j)
		{
			int &t=p5[i][j];
			char ch=g5[i][j];
			if(t==n) continue;
			int &val=g[i][j][t];
			if(val==0)
			{
				++t;
				upd=true;
			}
			else if(ch=='.')
			{
				val=0;
				++t;
				upd=true;
			}
			else if(val==-1)
			{
				val=ch-'A'+1;
				upd=true;
			}
			else if(val!=ch-'A'+1)
			{
				val=0;
				++t;
				upd=true;
			}
		}
		return upd;
}

bool update_bottom()
{
	bool upd=false;
	for(int i=0;i<n;++i)
		for(int j=0;j<n;++j)
		{
			int &t=p6[i][j];
			char ch=g6[i][j];
			if(t==n) continue;
			int &val=g[n-i-1][j][n-t-1];
			if(val==0)
			{
				++t;
				upd=true;
			}
			else if(ch=='.')
			{
				val=0;
				++t;
				upd=true;
			}
			else if(val==-1)
			{
				val=ch-'A'+1;
				upd=true;
			}
			else if(val!=ch-'A'+1)
			{
				val=0;
				++t;
				upd=true;
			}
		}
		return upd;
}

4
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
char a[41],count[26],current[21],mark[41],remain[81],ans[21],pos[41][41][41];
int i,j,k,n,go,len,step,skips,maxl,remains,start,unique,cases,ok;
int main()
{
	for(len=1;len<41;len++)
		for(step=1;step<41;step++)
		{
			memset(mark,0,sizeof(mark));
			go=0;
			mark[0]=1;
			pos[len][step][0]=0;
			for(i=1;i<len;i++)
			{
				skips=(step-1)%(len-i)+1;
				while(skips)
				{
					go++;
					if(go>=len)
						go=0;
					if(!mark[go])
						skips--;
				}
				mark[go]=1;
				pos[len][step][i]=go;
			}
		}
	while(1)
	{
		gets(a);
		for(n=0;a[n];n++);
			if(n<2)
				break;
		cases++;
		maxl=0;
		unique=0;
		memset(ans,0,sizeof(ans));
		memset(count,0,sizeof(count));
		for(i=0;i<n;i++)
			count[a[i]-'A']++;
		for(i=0;i<n;i++)
			if(count[a[i]-'A']>1)
				for(j=1;j<n;j++)
				{
					memset(current,0,sizeof(current));
					memset(mark,0,sizeof(mark));
					go=i;
					for(len=0;len<n/2;len++)
					{
						current[len]=a[go];
						mark[go]=1;
						if(len>=maxl&&strcmp(current,ans))
						{
							
							remains=0;
							ok=0;
							for(k=0;k<n;k++)
								if(!mark[k])
									remain[remains++]=a[k];
							for(k=0;k<remains;k++)
								remain[remains+k]=remain[k];
							for(start=0;start<remains;start++)
								if(remain[start]==current[0])
								{
									for(step=j+1;step<=n;step++)
									{
										for(k=1;k<=len;k++)
											if(remain[pos[remains][step][k]+start]!=current[k])
												break;
										if(k>len)
										{
											ok=1;
											
											if(len>maxl)
											{
												maxl=len;
												unique=1;
												memcpy(ans,current,sizeof(current));
											}
											else if(unique)
											{
												maxl++;
												unique=0;
											}
											else
											{
												unique=1;
												memcpy(ans,current,sizeof(current));
											}
											break;
										}
									}
									if(ok)
										break;
								}
						}
						skips=j;
						while(skips)
						{
							go++;
							if(go>=n)
								go=0;
							if(!mark[go])
								skips--;
						}
					}
				}
				printf("Code %d: ",cases);
				puts(unique?ans:"Codeword not unique");
	}
	return 0;
}







  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值