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

这题其实思想极其简单:

棋盘问题常见的算法都比较暴力,常用的有搜索和状压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. 【tmos】spring data jpa 创建方法名进行简单查询

    参考链接 spring data jpa 创建方法名进行简单查询:http://www.cnblogs.com/toSeeMyDream/p/6170790.html

  2. Jquery中AJAX参数详细(1)-转

    http://www.cnblogs.com/qiufuwu618/archive/2012/12/20/2826190.html Jquery中AJAX参数详细列表: 参数名 类型 描述 url S ...

  3. 获取异步API数据

    异步操作应该是以前学习 ajax 时才被明确提及,就目前的理解,同步就是同一时间只能做一件事,如果使用 ajax同步模式,则代码会卡在 xhr.send() 这里,只有请求响应的过程全部完成了才会执行 ...

  4. CF1099F Cookies

    题目地址:CF1099F Cookies 树形dp套树形数据结构 对每个节点 \(i\) ,分两步进行: 1.令 \(f_i\) 为Mitya在节点 \(i\) 停止游戏最多可以吃到多少块饼干 我们可 ...

  5. Linux iptables防火墙

    查找安装包yum list | grep iptables 安装iptables yum install iptables-services 重启防火墙使配置文件生效 systemctl restar ...

  6. Java9 新特性

    Java9中的9个新特性 1. Java 平台级模块系统 2. Linking 3. JShell: 交互式 Java REPL 4. 改进的 Javadoc 5. 集合工厂方法 6. 改进的 Str ...

  7. 【转】Git超实用总结,再也不怕记忆力不好了

    [转]Git超实用总结,再也不怕记忆力不好了 欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文由腾讯工蜂发表于云+社区专栏 Git 是什么? Git 是一个分布式的代码管理容器,本地和 ...

  8. caffe调试

    这里说一下关于如何进行Caffe的调试: 参考:https://blog.csdn.net/tsyccnh/article/details/51679121 简要说一下步骤: (1)首先对libcaf ...

  9. smarty半小时快速上手教程

    一:smarty的程序设计部分: 在smarty的模板设计部分我简单的把smarty在模板中的一些常用设置做了简单的介绍,这一节主要来介绍一下如何在smarty中开始我们程序设计.下载Smarty文件 ...

  10. linux系统快捷键

    tab 补全命令    两次tab    列出所有以字符前缀开头的命令 ctrl A    把光标移到命令行开头 ctrl E    把光标移到命令行结尾 ctrl C    强制终止当前的命令 ct ...