UVA题目求助
  • 板块题目总版
  • 楼主OMITW
  • 当前回复0
  • 已保存回复0
  • 发布时间2023/7/18 17:22
  • 上次更新2023/11/3 09:04:50
查看原帖
UVA题目求助
442437
OMITW楼主2023/7/18 17:22

Blade Ranas 2040

#include<bits/stdc++.h>
using namespace std;
long long t,n,m,l,r,k,maxx=-1;
char a[105][105];
long long mjh(int x,int y)
{
	long long sum=0;
	for(int i=x-1;i>=1;i--)//向第x行的上面枚举
		if(a[i][y]=='R')sum++;
		else if(a[i][y]=='#')break;//遇到墙就停止向上枚举
	for(int i=x+1;i<=n;i++)//向第x行的下面枚举
		if(a[i][y]=='R')sum++;
		else if(a[i][y]=='#')break;//遇到墙就停止向下枚举
	return sum;
}
long long mjl(int x,int y)
{
	long long sum=0;
	for(int i=y-1;i>=1;i--)//向第y行的左边枚举
		if(a[x][i]=='R')sum++;
		else if(a[x][i]=='#')break;//遇到墙就停止向左枚举
	for(int i=y+1;i<=m;i++)//向第y行的右边枚举
		if(a[x][i]=='R')sum++;
		else if(a[x][i]=='#')break;//遇到墙就停止向右枚举
	return sum;
}
long long mjd(int x,int y)
{
	long long sum=0;
	for(int i=x-1,j=y-1;i>=1&&j>=1;i--,j--)//向左上角枚举 
		if(a[i][j]=='R')sum++;
		else if(a[i][j]=='#')break;//遇到墙就停止向左上角枚举
	for(int i=x+1,j=y+1;i<=n&&j<=m;i++,j++)//向右下角枚举 
		if(a[i][j]=='R')sum++;
		else if(a[i][j]=='#')break;//遇到墙就停止向右下角枚举
	for(int i=x-1,j=y+1;i>=1&&j<=m;i--,j++)//向右上角枚举 
		if(a[i][j]=='R')sum++;
		else if(a[i][j]=='#')break;//遇到墙就停止向右上角枚举
	for(int i=x+1,j=y-1;i<=n&&j>=1;i++,j--)//向左下角枚举 
		if(a[i][j]=='R')sum++;
		else if(a[i][j]=='#')break;//遇到墙就停止向左下角枚举
	return sum;
}
int main()
{
	cin>>t;
	while(t--)
	{
		cin>>n>>m;
		for(int i=1;i<=n;i++)
			for(int j=1;j<=m;j++)
				cin>>a[i][j];
		for(int i=1;i<=n;i++)
			for(int j=1;j<=m;j++)
			{
				if(a[i][j]=='#')continue;//注意不能在墙上 
				k=(a[i][j]=='R');//判断这个位置是不是复制蛙 
				k+=mjh(i,j);//枚举行的复制蛙数量
				k+=mjl(i,j);//枚举列的复制蛙数量
				k+=mjd(i,j);//枚举对角线的c复制蛙数量
				if(k>maxx)//如果这个位置可以得到更多的复制蛙,那就取这个位置 
				{
					maxx=k;
					l=i;
					r=j;
				}
			}
		cout<<l<<" "<<r<<"\n";
		maxx=-1;//记得把最大值清到-1 
	}
	return 0;
}
2023/7/18 17:22
加载中...