链接

大意: n*n棋盘, 每个格子写有数字, 各不相同, 范围[1,n*n], 初始在数字1的位置, 可以操纵knight,bishop,rook三种棋子, 每走一步花费1, 交换棋子花费1, 问按顺序遍历完[1,n*n]的最少花费和最少花费下的最少交换次数

这题码了1个小时, WA on test 86, 没看出来是哪里错了, 不想改了

设状态(z,x,y)表示到达点(x,y)时棋子为z的最少花费, 每次BFS求出最短路, 再DP两次求出最少花费

#include <iostream>
#include <algorithm>
#include <cstdio>
#include <queue>
#define REP(i,a,n) for(int i=a;i<=n;++i)
#define x first
#define y second
using namespace std;
typedef pair<int,int> pii; const int N = 15, INF = 0x3f3f3f3f;
int n;
pii a[N*N];
int f[N*N][3], g[N*N][3], d[N*N][3][3];
const int dx[]={-2,-1,1,2,2,1,-1,-2};
const int dy[]={1,2,2,1,-1,-2,-2,-1};
const int dx1[]={1,-1,1,-1};
const int dy1[]={1,1,-1,-1};
struct _ {int z,x,y;};
int dis[3][N][N], vis[3][N][N]; int chk(int x, int y) {
return 1<=x&&x<=n&&1<=y&&y<=n;
} int bfs(int z1, int x1, int y1, int z2, int x2, int y2) {
queue<_> q;
q.push({z1,x1,y1});
memset(vis,0,sizeof vis);
memset(dis,INF,sizeof dis);
dis[z1][x1][y1] = 0;
while (!q.empty()) {
auto u = q.front();q.pop();
if (vis[u.z][u.x][u.y]) continue;
vis[u.z][u.x][u.y] = 1;
int w = dis[u.z][u.x][u.y]+1;
REP(i,0,7) {
int xx=u.x+dx[i], yy=u.y+dy[i];
if (!chk(xx,yy)) continue;
dis[0][xx][yy] = min(dis[0][xx][yy], w+(u.z!=0));
q.push({0,xx,yy});
}
REP(i,0,3) REP(j,1,n) {
int xx=u.x+j*dx1[i],yy=u.y+j*dy1[i];
if (!chk(xx,yy)) continue;
dis[1][xx][yy] = min(dis[1][xx][yy], w+(u.z!=1));
q.push({1,xx,yy});
}
REP(i,1,n) {
dis[2][i][u.y] = min(dis[2][i][u.y], w+(u.z!=2));
q.push({2,i,u.y});
dis[2][u.x][i] = min(dis[2][u.x][i], w+(u.z!=2));
q.push({2,u.x,i});
}
}
return dis[z2][x2][y2];
} int main() {
scanf("%d", &n);
REP(i,1,n) REP(j,1,n) {
int t;
scanf("%d", &t);
a[t] = {i,j};
}
REP(i,2,n*n) {
REP(j,0,2) f[i][j] = INF;
REP(j,0,2) REP(k,0,2) {
d[i][j][k] = bfs(k,a[i-1].x,a[i-1].y,j,a[i].x,a[i].y);
f[i][j] = min(f[i][j], f[i-1][k]+d[i][j][k]);
}
}
REP(i,2,n*n) {
REP(j,0,2) g[i][j] = INF;
REP(j,0,2) REP(k,0,2) {
if (f[i-1][k]+d[i][j][k]==f[i][j]) {
g[i][j] = min(g[i][j], g[i-1][k]+(j!=k));
}
}
}
int ans1=INF, ans2=INF;
REP(i,0,2) ans1=min(ans1,f[n*n][i]);
REP(i,0,2) if (ans1==f[n*n][i]) ans2=min(ans2,g[n*n][i]);
printf("%d %d\n", ans1, ans2);
}

Three Pieces CodeForces - 1065D (BFS)的更多相关文章

  1. codeforces 1065D

    题目链接:https://codeforces.com/problemset/problem/1065/D 题意:给你一个又1~n^2组成的n行n列的矩阵,你可以走日字型,直线,斜线,现在要求你从1走 ...

  2. Arthur and Walls CodeForces - 525D (bfs)

    大意: 给定格点图, 每个'.'的连通块会扩散为矩形, 求最后图案. 一开始想得是直接并查集合并然后差分, 但实际上是不对的, 这个数据就可以hack掉. 3 3 **. .** ... 正解是bfs ...

  3. Police Stations CodeForces - 796D (bfs)

    大意: 给定树, 有k个黑点, 初始满足条件:所有点到最近黑点距离不超过d, 求最多删除多少条边后, 使得原图仍满足条件. 所有黑点开始bfs, 贪心删边. #include <iostream ...

  4. Kilani and the Game CodeForces - 1105D (bfs)

    沙茶bfs打了2小时... queue入队量太大了, 放函数里直接T了, 改成全局46ms #include <iostream> #include <algorithm> # ...

  5. Fair CodeForces - 987D (bfs)

    链接 大意:给定无向图边权均为1, 每个节点有一种货物, 对于每个节点, 求出拿到$s$种不同货物的最短距离 (每种货物独立计算,并且不用返回) 因为$s$较小, 直接枚举每种货物即可 所以问题就转化 ...

  6. Connected Components? CodeForces - 920E (bfs)

    大意:给定无向图, 求补图的连通块数 bfs模拟即可, 这里用了map存图, set维护未划分的点集, 复杂度$O(nlog^2n)$, 用链表的话可以$O(n)$ #include <iost ...

  7. codeforces 60B bfs

    题意:给出一个六面体分为k层,每层n行m列,每个小立方体有'.'(空)与'#'(障碍)的状态,第一层某个空的位置有一个水龙头,水流每次往六个方向流动(...).最少时间水流能把立方体空的部分填满. 思 ...

  8. Board Game CodeForces - 605D (BFS)

    大意: 给定$n$张卡$(a_i,b_i,c_i,d_i)$, 初始坐标$(0,0)$. 假设当前在$(x,y)$, 若$x\ge a_i,y\ge b_i$, 则可以使用第$i$张卡, 使用后达到坐 ...

  9. Codeforces 1105D (BFS)

    题面 传送门 分析 考虑BFS while(棋盘没有满){ for 玩家 p{ 对p进行BFS,走s[p]步 } } 对于每个玩家p BFS的时候如果到了格子(x,y),就把\(vis[x][y]\) ...

随机推荐

  1. linux常用命令:rcp 命令

    rcp代表"remote file copy"(远程文件拷贝). 1.命令格式: rcp [参数] [源文件] [目标文件] 2.命令功能: 功能:  rcp命令用于在计算机之间拷 ...

  2. SNMP学习笔记之SNMPv3的报文格式以及基于USM的认证和加密过程

    下面我们就主要讲解SNMPv3的报文格式以及基于USM的认证和加密过程! 1.SNMPv3的消息格式 如下图1: 图 1 其中,整个SNMPv3消息可以使用认证机制,并对EngineID.Contex ...

  3. 怎么解决深入学习PHP的瓶颈

    PHP给学习者的感觉是:初学的时候很容易,但是学了2-3年,就深刻感觉遇到了瓶颈,很难深入,放弃又可惜.所谓"鸡肋,食之无味弃之可惜"的感觉很是贴切. 经常会有这种感觉:不学,看似 ...

  4. Adobe9阅读器渗透攻击——20145301

    Adobe9阅读器渗透攻击 实验步骤: 在kali终端中开启msfconsole,输入命令use exploit/windows/fileformat/adobe_cooltype_sing,进入该漏 ...

  5. SQLException: com.mchange.v2.c3p0.ComboPooledDataSource [ java.beans.IntrospectionException: java.lang.reflect.InvocationTargetException [numThreadsAwaitingCheckoutDefaultUser] ] has been closed()

    问题:Could not get JDBC Connection; nested exception is java.sql.SQLException: com.mchange.v2.c3p0.Com ...

  6. linux如何删除行首的空格

    答: sed 's/^ *//' jello.txt > hello.txt

  7. POJ 1830 开关问题(高斯消元)题解

    思路:乍一看好像和线性代数没什么关系.我们用一个数组B表示第i个位置的灯变了没有,然后假设我用u[i] = 1表示动开关i,mp[i][j] = 1表示动了i之后j也会跟着动,那么第i个开关的最终状态 ...

  8. 【Tomcat部署】Linux环境部署war包到tomcat

    以turbine为例. 一.部署 1.下载或者生成war包(从maven上下载war包,并改名字为turbine.war) 2.将turbine.war拷贝到$TOMCAT_HOME/webapps中 ...

  9. Java 类引入 学习记录规整

    之前觉得声明一个类,再把另一个包内的声明数值用第一个类打印出来就可以了(加入引入包类) 结果发现是不对的 看了看demo  得出正确结果    ImportTest 被运行 引入下面的Import类 ...

  10. PTA第一次作业

    5-5 #include <cstdio> #include <iostream> #include <cstdlib> using namespace std; ...