CF1065D
如果不喜欢过长代码的看官,请移步其他题解...
这题其实思想极其简单:
棋盘问题常见的算法都比较暴力,常用的有搜索和状压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的更多相关文章
- CF1065D Three Pieces
题目描述:给出一个n*n的棋盘,棋盘上每个格子有一个值.你有一个子,要求将这个子从1移到n*n(去k时可以经过比k大的点). 开局时它可以作为车,马,相(国际象棋).每走一步耗费时间1.你也可以中途将 ...
- CF1065D Three Pieces (多元最短路)
题目大意:给你一个棋盘,你需要控制棋子依次经过编号为1~n的所有点,棋子的可以是车,马,象,都依照国际象棋的行棋方式,每走一步消耗1单位时间,但每次更换棋子都需要额外1单位时间,求经过所有点需要的最少 ...
随机推荐
- printf是在libc库中么?
libc中果然有很多的函数,使用nm看了一下,里面竟然还有reboot函数,汗! 使用grep,可以看到各种 printf 也都在这里头. objdump是看函数的地址与函数名对应的,虽然也能证明pr ...
- yum2
首先yum源的主配置文件为/etc/yum.conf文件.这个文件一般不用动,而我们配置具体的各个yum源的配置文件在/etc/yum.repo.d目录下,所有以repo结尾的文件都是yum源配置文件 ...
- Flask表单(form)的应用
导入模块request模块 #指定请求方式,使用methods属性 @app.route("/",methods=['GET','POST']) def index(): #判断c ...
- org.springframework.beans.factory.CannotLoadBeanClassException-估计mapper出参 和 po字段不对应了
DEBUG [localhost-startStop-1] - Ignoring bean class loading failure for bean 'itemsService'org.sprin ...
- Django实战(一)-----用户登录与注册系统6(session会话、注册视图)
因为因特网HTTP协议的特性,每一次来自于用户浏览器的请求(request)都是无状态的.独立的. 通俗地说,就是无法保存用户状态,后台服务器根本就不知道当前请求和以前及以后请求是否来自同一用户.对于 ...
- hibernate 嵌套事务
hibernate 嵌套事务,多线程调试.问题麻烦啊,后续有时间补全.
- Tesseract处理背景渐变的图片
在Tesseract处理背景渐变图片不太理想的情况下, 可以利用Pillow库, 创建一个阈值过滤器来去掉渐变的背景色, 只把文字留下来, 从而让图片更清晰, 便于Tesseract读取: from ...
- LeetCode one Two Sum
LeetCode one Two Sum (JAVA) 简介:给定一个数组和目标值,寻找数组中符合求和条件的两个数. 问题详解: 给定一个数据类型为int的数组,一个数据类型为int的目标值targe ...
- P4126 [AHOI2009]最小割
题目地址:P4126 [AHOI2009]最小割 最小割的可行边与必须边 首先求最大流,那么最小割的可行边与必须边都必须是满流. 可行边:在残量网络中不存在 \(x\) 到 \(y\) 的路径(强连通 ...
- [Docker]CentOS7下Docker安装教程
想要倒腾Kubernetes的话,第一步就是要会安装Docker,这篇文章讲一讲过程 安装步骤 检查内核版本,必须是3.10以上 uname -r 安装Docker yum -y install do ...