如果不喜欢过长代码的看官,请移步其他题解...

这题其实思想极其简单:

棋盘问题常见的算法都比较暴力,常用的有搜索和状压dp

而这道题显然没啥能状压的,所以我们考虑搜索

但是仅仅搜索是不够的,因为有极大的可能搜到死...

所以我们引入记忆化

设状态f[i][j][k][0/1/2]代表目前在点(i,j)处,上一个到达的点(注意是达成要求而非经过)的编号为k,目前的棋子种类为1/2/3时,所需要的最小代价

当然这还不够,我们还要保证在代价最小时更换棋子次数最小,所以我们再用状态g[i][j][k][0/1/2]更新,下标含义与上述相同,表示对应状态所需的最小棋子更换次数

注意优先更新f,在保证f合法的情况下维护g

然后用bfs更新即可

#include <cstdio>
#include <cmath>
#include <cstring>
#include <cstdlib>
#include <iostream>
#include <algorithm>
#include <queue>
#include <stack>
#include <map>
#include <string>
#include <vector>
#include <ctime>
#include <set>
#include <deque>
#include <bitset>
using namespace std;
int dp[][][][];
int g[][][][];
int xp[],yp[];
int maps[][];
int dir[][]={{,},{,},{,-},{-,},{-,-},{-,-},{,-},{-,}};
int n;
bool check(int x,int y)
{
if(x>&&x<=n&&y>&&y<=n)
{
return ;
}
return ;
}
void bfs()
{
memset(dp,0x3f,sizeof(dp));
memset(g,0x3f,sizeof(g));
dp[xp[]][yp[]][][]=;//车
dp[xp[]][yp[]][][]=;//马
dp[xp[]][yp[]][][]=;//象
g[xp[]][yp[]][][]=;
g[xp[]][yp[]][][]=;
g[xp[]][yp[]][][]=;
queue <int> Qx,Qy,Qz,Qv;
for(int i=;i<=;i++)
{
Qx.push(xp[]);
Qy.push(yp[]);
Qz.push(i);
Qv.push();
}
while(!Qx.empty())
{
int ux=Qx.front();
int uy=Qy.front();
int uz=Qz.front();
int uv=Qv.front();
Qx.pop();
Qy.pop();
Qz.pop();
Qv.pop();
if(uv==n*n)
{
continue;
}
if(uz==)
{
for(int i=;i<=n;i++)
{
if(i==uy)
{
continue;
}
if(maps[ux][i]==uv+)
{
if(dp[ux][i][uv+][uz]>dp[ux][uy][uv][uz]+)
{
dp[ux][i][uv+][uz]=dp[ux][uy][uv][uz]+;
g[ux][i][uv+][uz]=g[ux][uy][uv][uz];
Qx.push(ux);
Qy.push(i);
Qz.push(uz);
Qv.push(uv+);
}else if(dp[ux][i][uv+][uz]==dp[ux][uy][uv][uz]+&&g[ux][i][uv+][uz]>g[ux][uy][uv][uz])
{
g[ux][i][uv+][uz]=g[ux][uy][uv][uz];
Qx.push(ux);
Qy.push(i);
Qz.push(uz);
Qv.push(uv+);
}
}else
{
if(dp[ux][i][uv][uz]>dp[ux][uy][uv][uz]+)
{
dp[ux][i][uv][uz]=dp[ux][uy][uv][uz]+;
g[ux][i][uv][uz]=g[ux][uy][uv][uz];
Qx.push(ux);
Qy.push(i);
Qz.push(uz);
Qv.push(uv);
}else if(dp[ux][i][uv][uz]==dp[ux][uy][uv][uz]+&&g[ux][i][uv][uz]>g[ux][uy][uv][uz])
{
g[ux][i][uv][uz]=g[ux][uy][uv][uz];
Qx.push(ux);
Qy.push(i);
Qz.push(uz);
Qv.push(uv);
}
}
}
for(int i=;i<=n;i++)
{
if(i==ux)
{
continue;
}
if(maps[i][uy]==uv+)
{
if(dp[i][uy][uv+][uz]>dp[ux][uy][uv][uz]+)
{
dp[i][uy][uv+][uz]=dp[ux][uy][uv][uz]+;
g[i][uy][uv+][uz]=g[ux][uy][uv][uz];
Qx.push(i);
Qy.push(uy);
Qz.push(uz);
Qv.push(uv+);
}else if(dp[i][uy][uv+][uz]==dp[ux][uy][uv][uz]+&&g[i][uy][uv+][uz]>g[ux][uy][uv][uz])
{
g[i][uy][uv+][uz]=g[ux][uy][uv][uz];
Qx.push(i);
Qy.push(uy);
Qz.push(uz);
Qv.push(uv+);
}
}else
{
if(dp[i][uy][uv][uz]>dp[ux][uy][uv][uz]+)
{
dp[i][uy][uv][uz]=dp[ux][uy][uv][uz]+;
g[i][uy][uv][uz]=g[ux][uy][uv][uz];
Qx.push(i);
Qy.push(uy);
Qz.push(uz);
Qv.push(uv);
}else if(dp[i][uy][uv][uz]==dp[ux][uy][uv][uz]+&&g[i][uy][uv][uz]>g[ux][uy][uv][uz])
{
g[i][uy][uv][uz]=g[ux][uy][uv][uz];
Qx.push(i);
Qy.push(uy);
Qz.push(uz);
Qv.push(uv);
}
}
}
if(dp[ux][uy][uv][]>dp[ux][uy][uv][uz]+)
{
dp[ux][uy][uv][]=dp[ux][uy][uv][uz]+;
g[ux][uy][uv][]=g[ux][uy][uv][uz]+;
Qx.push(ux);
Qy.push(uy);
Qz.push();
Qv.push(uv);
}else if(dp[ux][uy][uv][]==dp[ux][uy][uv][uz]+&&g[ux][uy][uv][]>g[ux][uy][uv][uz]+)
{
g[ux][uy][uv][]=g[ux][uy][uv][uz]+;
Qx.push(ux);
Qy.push(uy);
Qz.push();
Qv.push(uv);
}
if(dp[ux][uy][uv][]>dp[ux][uy][uv][uz]+)
{
dp[ux][uy][uv][]=dp[ux][uy][uv][uz]+;
g[ux][uy][uv][]=g[ux][uy][uv][uz]+;
Qx.push(ux);
Qy.push(uy);
Qz.push();
Qv.push(uv);
}else if(dp[ux][uy][uv][]==dp[ux][uy][uv][uz]+&&g[ux][uy][uv][]>g[ux][uy][uv][uz]+)
{
g[ux][uy][uv][]=g[ux][uy][uv][uz]+;
Qx.push(ux);
Qy.push(uy);
Qz.push();
Qv.push(uv);
}
}else if(uz==)//马
{
for(int i=;i<;i++)
{
int tx=ux+dir[i][];
int ty=uy+dir[i][];
if(tx<=||tx>n||ty<=||ty>n)
{
continue;
}
if(maps[tx][ty]==uv+)
{
if(dp[tx][ty][uv+][]>dp[ux][uy][uv][]+)
{
dp[tx][ty][uv+][]=dp[ux][uy][uv][]+;
g[tx][ty][uv+][]=g[ux][uy][uv][];
Qx.push(tx);
Qy.push(ty);
Qv.push(uv+);
Qz.push();
}else if(dp[tx][ty][uv+][uz]==dp[ux][uy][uv][uz]+&&g[tx][ty][uv+][uz]>g[ux][uy][uv][uz])
{
g[tx][ty][uv+][uz]=g[ux][uy][uv][uz];
Qx.push(tx);
Qy.push(ty);
Qz.push(uz);
Qv.push(uv+);
}
}else
{
if(dp[tx][ty][uv][]>dp[ux][uy][uv][]+)
{
dp[tx][ty][uv][]=dp[ux][uy][uv][]+;
g[tx][ty][uv][]=g[ux][uy][uv][];
Qx.push(tx);
Qy.push(ty);
Qv.push(uv);
Qz.push();
}else if(dp[tx][ty][uv][uz]==dp[ux][uy][uv][uz]+&&g[tx][ty][uv][uz]>g[ux][uy][uv][uz])
{
g[tx][ty][uv][uz]=g[ux][uy][uv][uz];
Qx.push(tx);
Qy.push(ty);
Qz.push(uz);
Qv.push(uv);
}
}
}
if(dp[ux][uy][uv][]>dp[ux][uy][uv][uz]+)
{
dp[ux][uy][uv][]=dp[ux][uy][uv][uz]+;
g[ux][uy][uv][]=g[ux][uy][uv][uz]+;
Qx.push(ux);
Qy.push(uy);
Qz.push();
Qv.push(uv);
}else if(dp[ux][uy][uv][]==dp[ux][uy][uv][uz]+&&g[ux][uy][uv][]>g[ux][uy][uv][uz]+)
{
g[ux][uy][uv][]=g[ux][uy][uv][uz]+;
Qx.push(ux);
Qy.push(uy);
Qz.push();
Qv.push(uv);
}
if(dp[ux][uy][uv][]>dp[ux][uy][uv][uz]+)
{
dp[ux][uy][uv][]=dp[ux][uy][uv][uz]+;
g[ux][uy][uv][]=g[ux][uy][uv][uz]+;
Qx.push(ux);
Qy.push(uy);
Qz.push();
Qv.push(uv);
}else if(dp[ux][uy][uv][]==dp[ux][uy][uv][uz]+&&g[ux][uy][uv][]>g[ux][uy][uv][uz]+)
{
g[ux][uy][uv][]=g[ux][uy][uv][uz]+;
Qx.push(ux);
Qy.push(uy);
Qz.push();
Qv.push(uv);
}
}else if(uz==)
{
for(int i=;i<=n;i++)
{
int tx=ux+i;
int ty=uy+i;
if(check(tx,ty))
{
if(maps[tx][ty]==uv+)
{
if(dp[tx][ty][uv+][]>dp[ux][uy][uv][]+)
{
dp[tx][ty][uv+][]=dp[ux][uy][uv][]+;
g[tx][ty][uv+][]=g[ux][uy][uv][];
Qx.push(tx);
Qy.push(ty);
Qv.push(uv+);
Qz.push();
}else if(dp[tx][ty][uv+][uz]==dp[ux][uy][uv][uz]+&&g[tx][ty][uv+][uz]>g[ux][uy][uv][uz])
{
g[tx][ty][uv+][uz]=g[ux][uy][uv][uz];
Qx.push(tx);
Qy.push(ty);
Qz.push(uz);
Qv.push(uv+);
}
}else
{
if(dp[tx][ty][uv][]>dp[ux][uy][uv][]+)
{
dp[tx][ty][uv][]=dp[ux][uy][uv][]+;
g[tx][ty][uv][]=g[ux][uy][uv][];
Qx.push(tx);
Qy.push(ty);
Qv.push(uv);
Qz.push();
}else if(dp[tx][ty][uv][uz]==dp[ux][uy][uv][uz]+&&g[tx][ty][uv][uz]>g[ux][uy][uv][uz])
{
g[tx][ty][uv+][uz]=g[ux][uy][uv][uz];
Qx.push(tx);
Qy.push(ty);
Qz.push(uz);
Qv.push(uv+);
}
}
}
tx=ux+i;
ty=uy-i;
if(check(tx,ty))
{
if(maps[tx][ty]==uv+)
{
if(dp[tx][ty][uv+][]>dp[ux][uy][uv][]+)
{
dp[tx][ty][uv+][]=dp[ux][uy][uv][]+;
g[tx][ty][uv+][]=g[ux][uy][uv][];
Qx.push(tx);
Qy.push(ty);
Qv.push(uv+);
Qz.push();
}else if(dp[tx][ty][uv+][uz]==dp[ux][uy][uv][uz]+&&g[tx][ty][uv+][uz]>g[ux][uy][uv][uz])
{
g[tx][ty][uv+][uz]=g[ux][uy][uv][uz];
Qx.push(tx);
Qy.push(ty);
Qz.push(uz);
Qv.push(uv+);
}
}else
{
if(dp[tx][ty][uv][]>dp[ux][uy][uv][]+)
{
dp[tx][ty][uv][]=dp[ux][uy][uv][]+;
g[tx][ty][uv][]=g[ux][uy][uv][];
Qx.push(tx);
Qy.push(ty);
Qv.push(uv);
Qz.push();
}else if(dp[tx][ty][uv][uz]==dp[ux][uy][uv][uz]+&&g[tx][ty][uv][uz]>g[ux][uy][uv][uz])
{
g[tx][ty][uv][uz]=g[ux][uy][uv][uz];
Qx.push(tx);
Qy.push(ty);
Qz.push(uz);
Qv.push(uv);
}
}
}
tx=ux-i;
ty=uy+i;
if(check(tx,ty))
{
if(maps[tx][ty]==uv+)
{
if(dp[tx][ty][uv+][]>dp[ux][uy][uv][]+)
{
dp[tx][ty][uv+][]=dp[ux][uy][uv][]+;
g[tx][ty][uv+][]=g[ux][uy][uv][];
Qx.push(tx);
Qy.push(ty);
Qv.push(uv+);
Qz.push();
}else if(dp[tx][ty][uv+][uz]==dp[ux][uy][uv][uz]+&&g[tx][ty][uv+][uz]>g[ux][uy][uv][uz])
{
g[tx][ty][uv+][uz]=g[ux][uy][uv][uz];
Qx.push(tx);
Qy.push(ty);
Qz.push(uz);
Qv.push(uv+);
}
}else
{
if(dp[tx][ty][uv][]>dp[ux][uy][uv][]+)
{
dp[tx][ty][uv][]=dp[ux][uy][uv][]+;
g[tx][ty][uv][]=g[ux][uy][uv][];
Qx.push(tx);
Qy.push(ty);
Qv.push(uv);
Qz.push();
}else if(dp[tx][ty][uv][uz]==dp[ux][uy][uv][uz]+&&g[tx][ty][uv][uz]>g[ux][uy][uv][uz])
{
g[tx][ty][uv][uz]=g[ux][uy][uv][uz];
Qx.push(tx);
Qy.push(ty);
Qz.push(uz);
Qv.push(uv);
}
}
}
tx=ux-i;
ty=uy-i;
if(check(tx,ty))
{
if(maps[tx][ty]==uv+)
{
if(dp[tx][ty][uv+][]>dp[ux][uy][uv][]+)
{
dp[tx][ty][uv+][]=dp[ux][uy][uv][]+;
g[tx][ty][uv+][]=g[ux][uy][uv][];
Qx.push(tx);
Qy.push(ty);
Qv.push(uv+);
Qz.push();
}else if(dp[tx][ty][uv+][uz]==dp[ux][uy][uv][uz]+&&g[tx][ty][uv+][uz]>g[ux][uy][uv][uz])
{
g[tx][ty][uv+][uz]=g[ux][uy][uv][uz];
Qx.push(tx);
Qy.push(ty);
Qz.push(uz);
Qv.push(uv+);
}
}else
{
if(dp[tx][ty][uv][]>dp[ux][uy][uv][]+)
{
dp[tx][ty][uv][]=dp[ux][uy][uv][]+;
g[tx][ty][uv][]=g[ux][uy][uv][];
Qx.push(tx);
Qy.push(ty);
Qv.push(uv);
Qz.push();
}else if(dp[tx][ty][uv][uz]==dp[ux][uy][uv][uz]+&&g[tx][ty][uv][uz]>g[ux][uy][uv][uz])
{
g[tx][ty][uv][uz]=g[ux][uy][uv][uz];
Qx.push(tx);
Qy.push(ty);
Qz.push(uz);
Qv.push(uv);
}
}
}
}
if(dp[ux][uy][uv][]>dp[ux][uy][uv][uz]+)
{
dp[ux][uy][uv][]=dp[ux][uy][uv][uz]+;
g[ux][uy][uv][]=g[ux][uy][uv][uz]+;
Qx.push(ux);
Qy.push(uy);
Qz.push();
Qv.push(uv);
}else if(dp[ux][uy][uv][]>dp[ux][uy][uv][uz]+&&g[ux][uy][uv][]>g[ux][uy][uv][uz]+)
{
g[ux][uy][uv][]=g[ux][uy][uv][uz]+;
Qx.push(ux);
Qy.push(uy);
Qz.push();
Qv.push(uv);
}
if(dp[ux][uy][uv][]>dp[ux][uy][uv][uz]+)
{
dp[ux][uy][uv][]=dp[ux][uy][uv][uz]+;
g[ux][uy][uv][]=g[ux][uy][uv][uz]+;
Qx.push(ux);
Qy.push(uy);
Qz.push();
Qv.push(uv);
}else if(dp[ux][uy][uv][]==dp[ux][uy][uv][uz]+&&g[ux][uy][uv][]>g[ux][uy][uv][uz]+)
{
g[ux][uy][uv][]=g[ux][uy][uv][uz]+;
Qx.push(ux);
Qy.push(uy);
Qz.push();
Qv.push(uv);
}
}
}
}
int main()
{
scanf("%d",&n);
for(int i=;i<=n;i++)
{
for(int j=;j<=n;j++)
{
scanf("%d",&maps[i][j]);
xp[maps[i][j]]=i;
yp[maps[i][j]]=j;
}
}
bfs();
int ans=0x3f3f3f3f;
int ret=0x3f3f3f3f;
for(int i=;i<=;i++)
{
if(ans>dp[xp[n*n]][yp[n*n]][n*n][i])
{
ans=dp[xp[n*n]][yp[n*n]][n*n][i];
ret=g[xp[n*n]][yp[n*n]][n*n][i];
}else if(ret>g[xp[n*n]][yp[n*n]][n*n][i]&&ans==dp[xp[n*n]][yp[n*n]][n*n][i])
{
ret=g[xp[n*n]][yp[n*n]][n*n][i];
}
}
printf("%d %d\n",ans,ret);
return ;
}

CF1065D的更多相关文章

  1. CF1065D Three Pieces

    题目描述:给出一个n*n的棋盘,棋盘上每个格子有一个值.你有一个子,要求将这个子从1移到n*n(去k时可以经过比k大的点). 开局时它可以作为车,马,相(国际象棋).每走一步耗费时间1.你也可以中途将 ...

  2. CF1065D Three Pieces (多元最短路)

    题目大意:给你一个棋盘,你需要控制棋子依次经过编号为1~n的所有点,棋子的可以是车,马,象,都依照国际象棋的行棋方式,每走一步消耗1单位时间,但每次更换棋子都需要额外1单位时间,求经过所有点需要的最少 ...

随机推荐

  1. linux 启动管理

  2. Django学习手册 - 初识django

    初识: django简介: 开放源代码的web应用框架 由python语言编写的. 一.框架基本概念(核心): 以上这个图就是 django 的核心逻辑图,必须熟记.后续的所有编程都跟这个图的逻辑息息 ...

  3. 迅为-ARM嵌入式开发一体化工业9.7寸屏幕 平板式智能触控屏

    产品名称:迅为9.7寸IPS高清屏幕 适用于:[iTOP-4412精英版][iTOP-4412全能版][iTOP-4418开发板][迅为-iMX6开发板] 分辨率:1024*768 触摸屏类型:电容屏 ...

  4. OsWatcher 使用详解

    软件下载地址: https://support.oracle.com/epmos/faces/DocumentDisplay?_afrLoop=520996062954556&id=30113 ...

  5. 数字图像处理的Matlab实现(4)—灰度变换与空间滤波

    第3章 灰度变换与空间滤波(2) 3.3 直方图处理与函数绘图 基于从图像亮度直方图中提取的信息的亮度变换函数,在诸如增强.压缩.分割.描述等方面的图像处理中扮演着基础性的角色.本节的重点在于获取.绘 ...

  6. ProtonMiner挖矿蠕虫

    特征 ProtonMail邮箱地址 利用漏洞 服务 漏洞 Hadoop 未授权访问 Drupal CVE-2018-7600 Redis 未授权访问 Spring Data Commons CVE-2 ...

  7. 使用Crash工具分析 Linux dump文件【转】

    转自:https://blog.csdn.net/bytxl/article/details/45025183 前言 Linux 内核(以下简称内核)是一个不与特定进程相关的功能集合,内核的代码很难轻 ...

  8. DFS不怂之《leetcode-岛屿的个数》

    leetcode刷到这道题: 给定一个由 '1'(陆地)和 '0'(水)组成的的二维网格,计算岛屿的数量.一个岛被水包围,并且它是通过水平方向或垂直方向上相邻的陆地连接而成的.你可以假设网格的四个边均 ...

  9. Lyk Love painting/convex hull/mumsic

    这场比赛真的是...打的好颓废啊... 所有题面的传送门 T1 分析: 我们发现 二分答案 + \(n^3\) \(dp\) 判断可行性 可以拿 60 分(于是就写好了啊!) 然后我们发现上面的 \( ...

  10. 洛谷 [USACO17OPEN]Bovine Genomics G奶牛基因组(金) ———— 1道骗人的二分+trie树(其实是差分算法)

    题目 :Bovine Genomics G奶牛基因组 传送门: 洛谷P3667 题目描述 Farmer John owns NN cows with spots and NN cows without ...