洛谷 P1930 亚瑟王的宫殿 Camelot

本文介绍了一个关于棋盘上骑士与王移动的问题,通过BFS预处理每个点到每个点的最短距离,并结合枚举策略,实现了一种有效算法来找到所有棋子移动到同一位置所需的最小步数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

传送门

题目大意:棋盘有骑士有王,让所有点跳到一个点,求所有棋子跳的步数和,和最小。

题解:bfs+枚举

王的人生:

1):自己走到聚集点

2):某个骑士来到王这里,两个棋子一起到聚集点

3):王走几步,遇到骑士,再一起到聚集点

枚举聚集点O(nm),枚举去王那里的骑士O(nm*num),枚举

相遇的点O((nm)^2*num),假设骑士是n*m个,那么时间复

杂度是O((nm)^3)....时间复杂度绝对不行....

模拟一下发现,骑士和国王相遇的点,肯定在国王周围很近

的格子,所以枚举相遇的点复杂度不是O(nm)而是O(几乎没有)

BFS预处理每个点到每个点的最短距离dis[][][][],sum[i][j],表示聚集

点在(i,j)所有骑士都到(i,j)的距离和kingdis[i][j]表示国王到(i,j)的距离。

最后的距离公式是

所有骑士到枚举的聚集点的距离-枚举的骑士到聚集点的距离+枚举的骑

士相遇点的距离+相遇点的距离到聚集点的距离+国王到相遇点的距离。

时间复杂度是O(AC)  O(8nm+nm*numk)..我猜的

错因:最后的距离公式加晕头了,少加了一项。dis数组没有初始化,有些点不能跳到某些点。

代码:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath> 
#include<queue>
#define inf 2147483647
#define maxn 50
using namespace std;

char s[10];
int n,m,x,num,ans;
int dis[maxn][maxn][maxn][maxn],king_dis[maxn][maxn];
int vis[maxn][maxn],sum[maxn][maxn];
int mx[]={-2,-2,-1,-1,1,1,2,2},
    my[]={1,-1,2,-2,2,-2,1,-1};
struct node{
    int x,y,ste;
};
queue<node>q;
struct Node{
    int x,y;
}king,kni[maxn*maxn];

void BFS(int x,int y){
    memset(vis,0,sizeof(vis));
    while(!q.empty())q.pop();
    vis[x][y]=true;
    node now;now.x=x;now.y=y;now.ste=0;
    dis[x][y][x][y]=0;
    q.push(now);
    while(!q.empty()){
        node now=q.front();q.pop();
        int nx=now.x,ny=now.y,ste=now.ste;
        for(int i=0;i<8;i++){
            int nxtx=nx+mx[i],nxty=ny+my[i];
            if(nxtx<1||nxty<1||nxtx>n||nxty>m||vis[nxtx][nxty])continue;
            dis[x][y][nxtx][nxty]=dis[x][y][nx][ny]+1;
            vis[nxtx][nxty]=true;
            node tmp;tmp.x=nxtx;tmp.y=nxty;tmp.ste=ste+1;
            q.push(tmp); 
        } 
    }  
}

int main(){
    scanf("%d%d",&n,&m);ans=inf;
    scanf("%s%d",s,&x);king.x=x;king.y=s[0]-'A'+1;
    while(scanf("%s%d",s,&x)!=EOF){
        kni[++num].x=x;kni[num].y=s[0]-'A'+1;    
    }
    memset(dis,0x3f,sizeof(dis));
    for(int i=1;i<=n;i++)
     for(int j=1;j<=m;j++)
      BFS(i,j);
    for(int i=1;i<=n;i++)
     for(int j=1;j<=m;j++)
      for(int k=1;k<=num;k++)
       sum[i][j]+=dis[kni[k].x][kni[k].y][i][j];
    for(int i=1;i<=n;i++)
     for(int j=1;j<=m;j++)
      king_dis[i][j]=max(abs(king.x-i),abs(king.y-j));
    for(int i=1;i<=n;i++)
     for(int j=1;j<=m;j++)
      ans=min(ans,sum[i][j]+king_dis[i][j]);
    for(int i=1;i<=n;i++)
      for(int j=1;j<=m;j++)
        for(int k=1;k<=num;k++)
          for(int nx=king.x-2;nx<=king.x+2;nx++)
            for(int ny=king.y-2;ny<=king.y+2;ny++)
              if(nx<1||ny<1||nx>n||ny>m)continue;
               else ans=min(ans,sum[i][j]-dis[kni[k].x][kni[k].y][i][j]+dis[kni[k].x][kni[k].y][nx][ny]+dis[nx][ny][i][j]+king_dis[nx][ny]);
    printf("%d\n",ans);
    return 0;
}
AC

 

转载于:https://www.cnblogs.com/zzyh/p/7739703.html

<think>好的,我现在需要帮助用户找到Camelot库的调用示例或教程。首先,我应该回忆一下Camelot库的基本信息。Camelot是一个Python库,主要用于从PDF中提取表格数据。用户可能是在处理PDF文档时需要提取表格,但不知道如何使用这个库。 接下来,我应该考虑用户的需求。他们需要的是具体的调用示例或教程,说明如何使用Camelot库。我需要确保提供的示例是正确且最新的,因为库的API可能会有变化。同时,用户可能还需要一些基本的安装指导和常见问题的解决方法。 首先,我应该检查Camelot的官方文档。通常,官方文档是最可靠的资源,会提供安装步骤、基本用法示例以及高级配置选项。比如,安装可能需要使用pip,并且依赖Ghostscript和Tkinter等库,这些可能需要额外安装,特别是在不同的操作系统上。 然后,我需要考虑用户可能的运行环境。例如,在Linux系统上,安装依赖项可能需要使用apt-get,而在Windows上可能需要下载安装程序。用户如果在安装过程中遇到问题,比如依赖项缺失,我应该提供相应的解决建议,比如安装Ghostscript。 接下来,编写一个简单的示例代码。比如,使用camelot.read_pdf()函数读取PDF文件,提取表格,然后导出为CSV。这个示例应该包括导入库、读取文件、处理表格和导出的步骤。同时,需要指出常用的参数,比如flavor(解析方法)、pages(指定页数)等,这些参数会影响提取的准确性和性能。 此外,用户可能需要了解不同解析方法(stream和lattice)的区别,以及如何选择适合自己PDF格式的方法。例如,stream适用于有分隔符的表格,而lattice适用于有明确线条的表格。 还需要考虑异常处理和调试。比如,如果在提取过程中出现错误,如何查看日志或调整参数。可能还需要提到Camelot的高级功能,比如自定义区域、调整精度等,但用户当前可能只需要基础用法。 最后,生成相关问题,帮助用户进一步了解Camelot库的使用,比如如何处理加密的PDF、提升提取精度、处理复杂表格结构等。这些问题可以引导用户更深入地探索库的功能,并解决实际应用中可能遇到的问题。 同时,我需要确保回答中引用了提供的参考资料,尽管这些资料主要是关于Maven的,但可能在用户的问题中提到Camelot时,可能没有直接相关的引用。因此,可能需要忽略这些引用,或者仅在没有冲突的情况下提及。 总结步骤: 1. 提供Camelot库的安装指南,包括依赖项。 2. 编写基础用法的代码示例。 3. 解释常用参数和解析方法。 4. 提及高级功能和常见问题解决。 5. 生成相关问题,帮助用户进一步学习。 需要验证Camelot的最新版本是否有语法变化,确保示例代码正确。另外,提醒用户注意PDF文件的结构,因为复杂的表格可能需要调整参数才能正确提取。</think>### Camelot库调用示例及教程 Camelot是一个专注于从PDF中提取表格数据的Python库。以下是基础使用方法和示例: #### 1. 安装依赖 ```bash pip install camelot-py[cv] # 基础安装 pip install camelot-py[all] # 包含高级依赖 ``` **系统依赖**: - Linux: `sudo apt-get install ghostscript python3-tk` - Windows: 需单独安装[Ghostscript](https://www.ghostscript.com/) #### 2. 基础使用示例 ```python import camelot # 读取PDF文件(假设文件在当前目录) tables = camelot.read_pdf('input.pdf', flavor='stream', pages='1-3') # 查看提取到的表格数量 print(f"共提取到 {tables.n} 个表格") # 导出第一个表格为CSV tables[0].to_csv('output.csv') # 显示表格数据(Jupyter环境) tables[0].df ``` [^1]: 需要正确配置Ghostscript路径,否则会报`GhostscriptNotFound`错误 #### 3. 关键参数说明 | 参数 | 说明 | |-----------|----------------------------------------------------------------------| | `flavor` | `stream`(基于文本间距)或`lattice`(基于表格线),默认为`lattice` | | `pages` | 指定页码,如`'1,3,5'`或`'1-4'` | | `edge_tol`| 边缘检测容忍度(默认50),数值越大识别越宽松 | #### 4. 高级技巧 - **指定表格区域**: ```python tables = camelot.read_pdf('input.pdf', table_areas=['10,50,400,200']) ``` - **精度优化**: ```python tables = camelot.read_pdf('input.pdf', strip_text='\n', row_tol=10) ``` - **批量处理**: ```python for table in tables: print(table.parsing_report) # 查看每个表格的解析报告 ``` #### 5. 常见错误处理 - **依赖缺失**:确保已正确安装Ghostscript并配置系统PATH - **加密PDF**:需先使用其他工具解密 - **复杂表格**:尝试组合使用`stream`和`lattice`模式
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值