2006 ACM-ICPC世界总决赛试题分析8-10

8

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
struct info
{
	int sign;
	int up,down,uCover,dCover;
	int sum;
};
const int MaxN=64;
int Cases,N,n,m,K,ans;
char dir;
info hor[MaxN+2][MaxN+1],ver[MaxN+1][MaxN+2];
info Nhor[MaxN+2][MaxN+1],Nver[MaxN+1][MaxN+2];
int Lhor[MaxN+1],Lver[MaxN+1];

void init()
{
	int i;
	memset(hor,0,sizeof(hor));
	memset(ver,0,sizeof(ver));
	for(i=0;i<n;i++)
	{
		hor[0][i].sign=hor[n][i].sign=1;
		hor[0][i].sum=hor[n][i].sum=1;
		ver[i][0].sign=ver[i][n].sign=1;
		ver[i][0].sum=ver[i][n].sum=1;
	}
	for(i=0;i<=n;i++)
		Lhor[i]=Lver[i]=i;
}

int get(int x,int s,int line,char dir)
{
	if(dir=='D' || dir=='R')
		return labs(x-line);
	else if(line+line>=s)
	{
		if(x<=line)
			return x;
		return line-(x-line);
	}
	else
	{
		if(x>=line)
			return s-x;
		return (s-line)-line+x;
	}
}

void work()
{
	int i,j,k,nNew,mNew,x,y;
	int line;
	char dir;
	scanf("%d%c",&line,&dir);
	while(dir!='U' && dir!='D' && dir!='R' && dir!='L')
		scanf("%c",&dir);
	if(dir=='U' || dir=='D')
	{
		line=Lhor[line];
		mNew=m;
		if(line>n-line)
			nNew=line;
		else
			nNew=n-line;
		for(i=0;i<=N;i++)
			Lhor[i]=get(Lhor[i],n,line,dir);
	}
	else
	{
		line=Lver[line];
		nNew=n;
		if(line>m-line)
			mNew=line;
		else
			mNew=m-line;
		for(i=0;i<=N;i++)
			Lver[i]=get(Lver[i],m,line,dir);
	}
	memset(Nhor,0,sizeof(Nhor));
	memset(Nver,0,sizeof(Nver));
	for(i=0;i<nNew;i++)
		Nver[i][0].sign=Nver[i][mNew].sign=1;
	for(i=0;i<mNew;i++)
		Nhor[0][i].sign=Nhor[nNew][i].sign=1;
	if(dir=='U')
		for(i=0;i<mNew;i++)
			Nhor[nNew][i].sum=1;
	if(dir=='D')
		for(i=0;i<mNew;i++)
			Nhor[0][i].sum=1;
	if(dir=='L')
		for(i=0;i<nNew;i++)
			Nver[i][mNew].sum=1;
	if(dir=='R')
		for(i=0;i<nNew;i++)
			Nver[i][0].sum=1;
	for(i=0;i<=n;i++)
		for(j=0;j<m;j++)
		{
			x=i;y=j;
			if(dir=='U' || dir=='D')
				x=get(x,n,line,dir);
			else
				y=get(y,m,line,dir);
			if((dir=='R' && j<line) || (dir=='L' && j>=line))
				y--;
			if(Nhor[x][y].sign)
			{
				if(hor[i][j].sign)
					Nhor[x][y].sum+=hor[i][j].sum;
				else
					Nhor[x][y].sum +=hor[i][j].down;
			}
			else
			{
				if(hor[i][j].sign)
				{
					if((i<line&&dir=='U') || (i>=line && dir=='D'))
						Nhor[x][y].down+=hor[i][j].sum;
					else
						Nhor[x][y].up+=hor[i][j].sum;
				}
				else
				{
					if((i<line&&dir=='U') || (i>=line&&dir=='D') || (j<line&&dir=='L') || (j>=line&&dir=='R'))
					{
						Nhor[x][y].down=hor[i][j].down;
						Nhor[x][y].dCover=1;
						if(!Nhor[x][y].uCover)
							Nhor[x][y].up+=hor[i][j].up;
					}
					else
					{
						Nhor[x][y].up=hor[i][j].down;
						Nhor[x][y].uCover=1;
						if(!Nhor[x][y].dCover)
							Nhor[x][y].down+=hor[i][j].up;
					}
				}
			}
		}
	for(i=0;i<n;i++)
		for(j=0;j<=m;j++)
		{
			x=i;
			y=j;
			if(dir=='U' || dir=='D')
				x=get(x,n,line,dir);
			else
				y=get(y,m,line,dir);
			if((dir=='U' && i>=line) || (dir=='D'&&i<line))
				x--;
			if(Nver[x][y].sign)
			{
				if(ver[i][j].sign)
					Nver[x][y].sum+=ver[i][j].sum;
				else
					Nver[x][y].sum+=ver[i][j].down;
			}
			else
			{
				if(ver[i][j].sign)
				{
					if((j<line&&dir=='L')||(j>=line&&dir=='R'))
						Nver[x][y].down+=ver[i][j].sum;
					else
						Nver[x][y].up+=ver[i][j].sum;
				}
				else
				{
					if((i<line&&dir=='U')||(i>=line&&dir=='D')||(j<line&&dir=='L')||(j>=line&&dir=='R'))
					{
						Nver[x][y].down=ver[i][j].down;
						Nver[x][y].dCover=1;
						if(!Nver[x][y].uCover)
							Nver[x][y].up+=ver[i][j].up;
					}
					else
					{
						Nver[x][y].up=ver[i][j].down;
						Nver[x][y].uCover=1;
						if(!Nver[x][y].dCover)
							Nver[x][y].down+=ver[i][j].up;
					}
				}
			}
		}
		memcpy(hor,Nhor,sizeof(hor));
		memcpy(ver,Nver,sizeof(ver));
		n=nNew;m=mNew;
}

int main()
{
	while(scanf("%d %d",&n,&K) && (n||K))
	{
		n++;
		N=m=n;
		init();
		for(;K;K--)
		work();
		ans=hor[0][0].sum-1+hor[1][0].sum-1+ver[0][0].sum-1+ver[0][1].sum-1;
		printf("Case %d: %d pockets\n",++Cases,ans);
	}
	return 0;
}

9

#include<stdio.h>
#include<iostream>
#include<string.h>
#include<stdlib.h>
using namespace std;
const int MaxP=50;
int P,R,cases,i,j,k,sum,ans;

string name[MaxP],s1,s2;
int a[MaxP][MaxP];

int find(string s)
{
	int i;
	for(i=0;i<sum;i++)
		if(name[i]==s)
			return i;
	name[sum]=s;sum++;
	return sum-1;
}

bool init()
{
	scanf("%d %d",&P,&R);
	if(P==0&R==0)
		return false;
	sum=0;
	memset(a,0,sizeof(a));
	for(i=0;i<R;i++)
	{
		cin>>s1>>s2;
		j=find(s1);
		k=find(s2);
		a[j][k]=a[k][j]=1;
	}
	return true;
}

int main()
{
	cases=0;
	while(init())
	{
		for(k=0;k<P;k++)
			for(i=0;i<P;i++)
				for(j=0;j<P;j++)
					if(a[i][k]&&a[k][j])
						if(a[i][j]==0||a[i][j]>a[i][k]+a[k][j])
							a[i][j]=a[j][i]=a[i][k]+a[k][j];
		ans=0;
		for(i=0;i<P;i++)
			for(j=i+1;j<P;j++)
				if(a[i][j]==0)
					ans=P+10;
				else if(a[i][j]>ans)
					ans=a[i][j];
		if(ans>P)
			printf("Network %d: DISCONNECTED\n\n",++cases);
		else
			printf("Network %d: %d\n\n",++cases,ans);
	}
	return 0;
}


10

#include<stdio.h>
const int MaxN=100;
const int Max=1000;
int Cases,n,m,i,j,k,x,y;
int dis[MaxN][MaxN];
int tr[MaxN*MaxN*3];
int ans[MaxN][MaxN];

void Make(int n,int x,int y)
{
	tr[n]=Max;
	if(x==y)
		return;
	Make(n+n,x,(x+y)/2);
	Make(n+n+1,(x+y)/2+1,y);
}

void Change(int n,int x,int y,int ch,int data)
{
	if(x==y)
	{
		tr[n]=data;
	}
	else if((x+y)/2>=ch)
	{
		Change(n+n,x,(x+y)/2,ch,data);
		if(tr[n+n]<tr[n+n+1])
			tr[n]=tr[n+n];
		else
			tr[n]=tr[n+n+1];
	}
	else
	{
		Change(n+n+1,(x+y)/2+1,y,ch,data);
		if(tr[n+n]<tr[n+n+1])
			tr[n]=tr[n+n];
		else
			tr[n]=tr[n+n+1];
	}
}

int Get_Min(int n,int x,int y)
{
	if(x==y)
		return x;
	if(tr[n+n]<tr[n+n+1])
		return Get_Min(n+n,x,(x+y)/2);
	else
		return Get_Min(n+n+1,(x+y)/2+1,y);
}

int main()
{
	Cases=0;
	while(scanf("%d %d",&n,&m)&&n)
	{
		for(i=0;i<n;i++)
			for(j=0;j<n;j++)
				dis[i][j]=Max;
		for(i=0;i<m;i++)
		{
			scanf("%d %d",&x,&y);
			dis[x-1][y-1]=1;
		}
		for(i=0;i<n;i++)
			dis[i][i]=0;
		for(k=0;k<n;k++)
			for(i=0;i<n;i++)
				for(j=0;j<n;j++)
					if(dis[i][j]>dis[i][k]+dis[k][j])
						dis[i][j]=dis[i][k]+dis[k][j];
		Make(1,0,n*n-1);
		Change(1,0,n*n-1,0,1);
		for(i=0;i<n;i++)
			for(j=0;j<n;j++)
				ans[i][j]=Max;
		ans[0][0]=1;
		while(tr[1]<Max)
		{
			x=Get_Min(1,0,n*n-1);
			y=x%n,x/=n;
			if(x==1&&y==1)
				break;
			if(x!=y&&ans[y][x]<=Max&&ans[x][y]+dis[x][y]-1<ans[y][x])
			{
				ans[y][x]=ans[x][y]+dis[x][y]-1;
				Change(1,0,n*n-1,y*n+x,ans[y][x]);
			}
			for(i=0;i<n;i++)
				if(i!=x&&i!=y)
				{
					if(dis[x][i]==1&&ans[i][y]<=Max&&ans[x][y]+1<ans[i][y])
					{
						ans[i][y]=ans[x][y]+1;
						Change(1,0,n*n-1,i*n+y,ans[i][y]);
					}
					if(dis[i][y]==1&&ans[x][i]<=Max&&ans[x][y]+1<ans[x][i])
					{
						ans[x][i]=ans[x][y]+1;
						Change(1,0,n*n-1,x*n+i,ans[x][i]);
					}
				}
			if(dis[x][y]==1&&ans[y][y]<=Max&&ans[x][y]<ans[y][y])
			{
				ans[y][y]=ans[x][y];
				Change(1,0,n*n-1,y*n+y,ans[x][y]);
			}
			if(dis[x][y]==1&&ans[x][x]<=Max&&ans[x][y]<ans[x][x])
			{
				ans[x][x]=ans[x][y];
				Change(1,0,n*n-1,x*n+x,ans[x][y]);
			}
			ans[x][y]=Max+1;
			Change(1,0,n*n-1,x*n+y,ans[x][y]);
		}
		printf("Network %d\n",++Cases);
		if(ans[1][1]==Max)
			printf("Impossible\n\n");
		else
			printf("Minimum number of nodes = %d\n\n",ans[1][1]);
	}
	return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
资源包主要包含以下内容: ASP项目源码:每个资源包中都包含完整的ASP项目源码,这些源码采用了经典的ASP技术开发,结构清晰、注释详细,帮助用户轻松理解整个项目的逻辑和实现方式。通过这些源码,用户可以学习到ASP的基本语法、服务器端脚本编写方法、数据库操作、用户权限管理等关键技术。 数据库设计文件:为了方便用户更好地理解系统的后台逻辑,每个项目中都附带了完整的数据库设计文件。这些文件通常包括数据库结构图、数据表设计文档,以及示例数据SQL脚本。用户可以通过这些文件快速搭建项目所需的数据库环境,并了解各个数据表之间的关系和作用。 详细的开发文档:每个资源包都附有详细的开发文档,文档内容包括项目背景介绍、功能模块说明、系统流程图、用户界面设计以及关键代码解析等。这些文档为用户提供了深入的学习材料,使得即便是从零开始的开发者也能逐步掌握项目开发的全过程。 项目演示与使用指南:为帮助用户更好地理解和使用这些ASP项目,每个资源包中都包含项目的演示文件和使用指南。演示文件通常以视频或图文形式展示项目的主要功能和操作流程,使用指南则详细说明了如何配置开发环境、部署项目以及常见问题的解决方法。 毕业设计参考:对于正在准备毕业设计的学生来说,这些资源包是绝佳的参考材料。每个项目不仅功能完善、结构清晰,还符合常见的毕业设计要求和标准。通过这些项目,学生可以学习到如何从零开始构建一个完整的Web系统,并积累丰富的项目经验。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值