zcmu 2201 (dfs+邻接表)

题目链接:http://acm.zcmu.edu.cn/JudgeOnline/problem.php?id=2201

思路:建立四个数组U,D,L,R,分别表示四个方位,存储每个节点的上下左右的信息。

然后进行深搜,查找出长度最大的节点,并记录它的长度。

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int maxn = 5050;
char a[maxn][maxn];
int n,m,U[maxn],D[maxn],R[maxn],L[maxn];
void Init()
{
	int i,j,tp,l;
	for(i=0;i<n;i++)
	{
		l=-1;
		for(j=0;j<m;j++)
		{
			if(a[i][j]!='.')
			{
				tp=i*m+j;
				L[tp]=l; //l表示上一个节点的位置,上一个节点就是这个节点的左结点 
				if(l!=-1) R[l]=tp; //上一个节点的右节点就是这个节点的右节点 
				l=tp; //记录当前的节点状态。 
			}
		}
		R[l]=-1; //每一行的最后一个节点的右节点是-1 
	}
	for(j=0;j<m;j++)
	{
		int u=-1;  
		for(i=0;i<n;i++)
		{
			if(a[i][j]!='.')
			{
				tp=i*m+j; 
				U[tp]=u; //u表示本节点的上一个节点 
				if(u!=-1) D[u]=tp; //上一个节点的下节点就是本节点 
				u=tp; //保存上一个节点的状态 
			}
		}
		D[u]=-1; //每列最后一个节点的下节点是-1 
	} 
}
void Delete(int x,int y)
{
	int index=x*m+y;
	if(U[index]!=-1) D[U[index]]=D[index]; //当index不是最高节点时,index的下一个节点的值变成了当前节点的值,相当于抹去了当前节点。
	if(D[index]!=-1) U[D[index]]=U[index]; 
	if(L[index]!=-1) R[L[index]]=R[index];
	if(R[index]!=-1) L[R[index]]=L[index];
} 
int dfs(int x,int y)
{
	Delete(x,y);
	int index=x*m+y;
	if(a[x][y]=='U')
	{
		if(U[index]==-1) return 1;
		return dfs(U[index]/m,y)+1;
	}
	else if(a[x][y]=='D')
	{
		if(D[index]==-1) return 1;
		return dfs(D[index]/m,y)+1;
	}
	else if(a[x][y]=='R')
	{
		if(R[index]==-1) return 1;
		return dfs(x,R[index]%m)+1;
	}
	else if(a[x][y]=='L')
	{
		if(L[index]==-1) return 1;
		return dfs(x,L[index]%m)+1;
	}
}
int main(void)
{
	int i,j;
	while(cin>>n>>m)
	{
		for(i=0;i<n;i++) scanf("%s",a[i]);
		int cnt=0,mx=-1;
		for(i=0;i<n;i++)
		{
			for(j=0;j<m;j++)
			{
				if(a[i][j]!='.')
				{
					Init(); //标记所有点最近的上下左右节点 
					int len=dfs(i,j);
					if(len>mx) mx=len,cnt=1;
					else if(len==mx) cnt++;
				}
			}
		}
		cout<<mx<<" "<<cnt<<endl;
	}
	return 0;
} 

参考文章:https://blog.csdn.net/sdau20163942/article/details/80348700

### 回答1: zcmu 1093 简单计算器是一道编程题目,要求实现一个简单的计算器,能够进行加、减、乘、除四种基本运算。该题目主要考察编程基础能力和算法思维能力,需要熟练掌握基本的运算符和控制语句,能够设计合理的算法实现计算器功能。 ### 回答2: zcmu 1093 简单计算器是一种基于计算机技术的工具,用于进行基本算术运算,如加减乘除等。它能够简化我们在日常生活中的计算工作,提高计算效率,减少出错率。 使用zcmu 1093 简单计算器非常简单,只需输入需要计算的数字和符号,就能够得到计算结果。它可以进行多个数字之间的复杂运算,同时还支持小数、百分数、平方根等复杂运算。另外,zcmu 1093 简单计算器还可以存储中间计算结果,方便我们进行多步计算或调整计算过程。 除了日常的计算工作,zcmu 1093 简单计算器还可用于科学计算、工程设计等领域。许多专业软件都是基于简单计算器原理设计的,它们具有更高的计算精度和更复杂的运算能力,能够支持更高级别的科学计算和技术分析。 总之,zcmu 1093 简单计算器在日常生活中有着广泛的应用,它使我们的计算工作变得更加高效、准确。并且,随着科技的不断发展,这种计算工具也在不断地更新和改进,为我们的计算工作提供更加便捷、多样化的选择。 ### 回答3: ZCMU 1093 简单计算器是一道基础的算法题目,需要实现一个简单的计算器程序,支持加、减、乘、除四种基本运算,可以对两个整数进行运算并输出结果。 要实现这道题目,首先需要根据输入的运算符来判断应该进行的运算类型,并根据运算符的不同,执行不同的计算操作。同时,应注意除数不能为零的情况,避免程序出现异常。 在编写程序的过程中,可以使用 switch case 语句来判断不同的运算类型,并执行相应的计算操作。同时,为了能有效地判断输入的运算符,可以使用输入字符串的方式进行处理,提取出运算符进行比较。 此外,在程序中还需要进行合法性判断,确保输入的数字均为整数且在合理的范围内,以避免程序运行出现异常情况。同时,还需要考虑输入格式的问题,应确保输入的数字和运算符符合题目要求。 综上所述,ZCMU 1093 简单计算器是一道基础的算法题目,需要实现一个简单的计算器程序,支持加、减、乘、除四种基本运算,注意程序的合法性判断和输入格式的处理,能够熟练地运用 switch case 等语句完成程序的编写。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值