当前位置: 首页 > article >正文

第 5 场 算法季度赛

题目:

3.BlueAI【算法赛】 - 蓝桥云课

3. BlueAI【算法赛】

问题描述

2317年,小蓝终于在蓝桥杯国赛中一举夺魁,成为了新一届的国特选手。这次,他不仅赢得了无上的荣耀,更是获得了一个挑战蓝桥杯组委会秘密训练的超级AI——BlueAI的机会。

挑战项目是在一个 N×N 的跳棋棋盘上进行对弈。棋盘上有三种符号:

  • L: 小蓝的棋子。
  • Q: BlueAI的棋子。
  • .: 空位。

小蓝的棋子可以跳过BlueAI的棋子并吃掉它,但必须满足以下条件:

  1. 跳跃方向:棋子必须沿着棋盘的四个对角线方向(左上、左下、右上、右下)之一进行跳跃。
  2. 跳跃条件:沿着选定的对角线方向,与相邻的第一个位置必须是Q,第二个位置必须是空位。这样,小蓝的棋子就可以跳跃到第二个位置上,并吃掉Q。吃完Q后,原来Q所在的位置将变为空位。
  3. 多次跳跃:小蓝可以在一次移动中连续吃掉多个BlueAI的棋子。每次跳跃之后,都可以重新选择跳跃方向。也就是说,在吃掉一个Q后,如果新的位置仍然满足跳跃条件,小蓝可以选择任意一个对角线方向继续跳跃并吃掉下一个Q,以此类推,直到无法继续吃子为止。

现在,给定当前棋盘的状态,你的任务是计算在小蓝的回合中,他一次移动最多可以吃掉多少个BlueAI的棋子。

输入格式

第一行包含一个整数 N (5 ≤ N ≤ 12),表示棋盘的大小。

接下来的 N 行,每行包含一个长度为 N、仅由 LQ. 构成的字符串,表示棋盘的状态。

数据为随机生成,且保证至少存在一个 L

输出格式

输出一个整数,表示小蓝在一次移动中最多可以吃掉的 Q 的数量。

样例输入
5
.L...
.Q...
.Q...
.Q...
.....
样例输出
2

思路:

1.对每一个L进行深搜,注意回溯。

2.方向数组是对角线的,第一次一圈确认是否存在q,第二次再次加一次方向数组的值,就是当前L可以跳的点

3.使用全局变量的时候,也要回溯,不然会造成答案总更多。

代码如下:

#include <iostream>
#include<algorithm>
#include<cstring>
using namespace std;
struct Node{
  int x;
  int y;
};
const int N = 13;
int n;
int cnt;
char map[N][N];
Node list[N*N];//储存l的数组 
int ans = -1;
int dx[] = {1,1,-1,-1};
int dy[] = {1,-1,-1,1};
void dfs(int x,int y)
{
	for(int k = 0 ; k < 4 ; k++)//先找四个对角线有没有Q 
	{
		int tx = x + dx[k];
		int ty = y + dy[k];
		if(tx >= 0 && tx < n && ty >= 0 && ty < n)//边界处理 
		{
			if(map[tx][ty] == 'Q' )//找到Q,跳跃 
			{ 
				 int Lx = tx + dx[k];
				 int Ly = ty + dy[k];
				 if(Lx >= 0 && Lx < n && Ly >= 0 && Ly < n)//边界处理
				 {
				 	if(map[Lx][Ly] == '.')
				 	{
				 		cnt++;
				 		map[x][y] = '.';//L的出发点 
				 		map[tx][ty] = '.';//Q被吃了 
				 		map[Lx][Ly] = 'L';//L的新点 
				 		dfs(Lx,Ly); 
				 		map[x][y] = 'L';
				 		map[tx][ty] = 'Q';
						map[Lx][Ly] = '.';
						cnt--; 
					}
				 }
					
			}
		}
	}

        ans = max(ans, cnt);
}
int main()
{
  int num = 1;
  cin >> n;
  
  for(int i = 0 ; i < n ; i++)
  {
    for(int j = 0 ; j < n ; j++)
    {
       cin >> map[i][j];
       if(map[i][j] == 'L')
       {
	       list[num].x = i;
	       list[num].y = j;
	       num++;
	   }
    }
  }
	for(int i = 1 ; i < num ; i++)//对每一个L进行深搜 
	{
		cnt = 0;
		dfs(list[i].x,list[i].y);
	}
  cout << 	ans; 
  return 0;
}


http://www.kler.cn/a/502280.html

相关文章:

  • 当当网热销书籍数据采集与可视化分析
  • 开发人员学习书籍推荐(C#、Python方向)
  • Python使用socket实现简易的http服务
  • 详解 Docker 启动 Windows 容器第二篇:技术原理与未来发展方向
  • LiveNVR监控流媒体Onvif/RTSP常见问题-二次开发接口jquery调用示例如何解决JS|axios调用接口时遇到的跨域问题
  • <论文>时序大模型如何应用于金融领域?
  • 51c大模型~合集104
  • 计算机网络之---网络层的基本功能
  • 使用python调用JIRA6 REST API及遇到的问题
  • 自然语言处理之jieba分词和TF-IDF分析
  • Linux 高级路由 —— 筑梦之路
  • 链条缺陷检测数据集VOC+YOLO格式1422张7类别
  • [Android]service命令的使用
  • 【微服务】面试 3、 服务监控 SkyWalking
  • 景联文科技提供高质量多模态数据处理服务,驱动AI新时代
  • 经典软件测试面试题大全(含答案+文档)
  • Redis 的大 Key 对持久化有什么影响
  • AI学习路线图-提示词工程-吴恩达
  • 爬虫程序如何存储数据到数据库?
  • 【Vim Masterclass 笔记11】S06L24 + L25:Vim 文本的插入、变更、替换与连接操作同步练习(含点评课)
  • 计算机网络—地址与子网(IPv4)相关知识总结
  • 基于网络爬虫技术的网络新闻分析
  • 解决无法远程管理Windows Server服务器核心安装
  • 【Linux】统信UOS服务器安装MySQL8.0(RPM)
  • 【PPTist】插入形状、插入图片、插入图表
  • Nginx安全加固系列:404页面失去保护