Three Pieces CodeForces - 1065D (BFS)
大意: 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)的更多相关文章
- codeforces 1065D
题目链接:https://codeforces.com/problemset/problem/1065/D 题意:给你一个又1~n^2组成的n行n列的矩阵,你可以走日字型,直线,斜线,现在要求你从1走 ...
- Arthur and Walls CodeForces - 525D (bfs)
大意: 给定格点图, 每个'.'的连通块会扩散为矩形, 求最后图案. 一开始想得是直接并查集合并然后差分, 但实际上是不对的, 这个数据就可以hack掉. 3 3 **. .** ... 正解是bfs ...
- Police Stations CodeForces - 796D (bfs)
大意: 给定树, 有k个黑点, 初始满足条件:所有点到最近黑点距离不超过d, 求最多删除多少条边后, 使得原图仍满足条件. 所有黑点开始bfs, 贪心删边. #include <iostream ...
- Kilani and the Game CodeForces - 1105D (bfs)
沙茶bfs打了2小时... queue入队量太大了, 放函数里直接T了, 改成全局46ms #include <iostream> #include <algorithm> # ...
- Fair CodeForces - 987D (bfs)
链接 大意:给定无向图边权均为1, 每个节点有一种货物, 对于每个节点, 求出拿到$s$种不同货物的最短距离 (每种货物独立计算,并且不用返回) 因为$s$较小, 直接枚举每种货物即可 所以问题就转化 ...
- Connected Components? CodeForces - 920E (bfs)
大意:给定无向图, 求补图的连通块数 bfs模拟即可, 这里用了map存图, set维护未划分的点集, 复杂度$O(nlog^2n)$, 用链表的话可以$O(n)$ #include <iost ...
- codeforces 60B bfs
题意:给出一个六面体分为k层,每层n行m列,每个小立方体有'.'(空)与'#'(障碍)的状态,第一层某个空的位置有一个水龙头,水流每次往六个方向流动(...).最少时间水流能把立方体空的部分填满. 思 ...
- 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$张卡, 使用后达到坐 ...
- Codeforces 1105D (BFS)
题面 传送门 分析 考虑BFS while(棋盘没有满){ for 玩家 p{ 对p进行BFS,走s[p]步 } } 对于每个玩家p BFS的时候如果到了格子(x,y),就把\(vis[x][y]\) ...
随机推荐
- Hive表中Partition的创建
作用: 在Hive Select查询中一般会扫描整个表内容,会消耗很多时间做没必要的工作.有时候只需要扫描表中关心的一部分数据,在对应的partition里面去查找就可以,减少查询时间. 1. 创建表 ...
- linux常用命令(替换)
1. vi 模式下的替换命令: s 表示替换(substitute),g表示全局搜索(global search) :s/vivian/sky/ 替换当前行第一个 vivian 为 sky :s/vi ...
- Linux基础命令---cmp
cmp 用字节的方式,比较两个文件是否存在差异,但是不保存运算结果.Cmp指令只会根据结果设置相关的标志位,这个指令之后往往会跟着一个条件跳转指令. 此命令的适用范围:RedHat.RHEL.Ubun ...
- Python之路----各类推导式
[每一个元素或者是和元素相关的操作 for 元素 in 可迭代数据类型] #遍历之后挨个处理[满足条件的元素相关的操作 for 元素 in 可迭代数据类型 if 元素相关的条件] #筛选功能 列表推导 ...
- servlet之一(概念/如何写/运行/错误提示/乱码处理)
# 1. 什么是Servlet? sun公司制订的一种用来扩展web服务器功能的组件规范. ## (1) 扩展web服务器功能(servlet的产生背景) web服务器只能处理静态资源 ...
- 20145324王嘉澜 《网络对抗技术》 MAL_逆向与Bof基础
实践目标 •本次实践的对象是一个名为pwn1的linux可执行文件. •该程序正常执行流程是:main调用foo函数,foo函数会简单回显任何用户输入的字符串. •该程序同时包含另一个代码片段,get ...
- UVa 12661 Funny Car Racing - spfa
很简单的一道最短路问题.分情况处理赛道的打开和关闭. Code /** * UVa * Problem#12661 * Accepted * Time:50ms */ #include<iost ...
- 在服务中用管理员权限创建一个可弹出UI的进程 (转载)
转载:http://blog.csdn.net/woshinia/article/details/7850295 转载:http://blog.csdn.net/hurryboylqs/article ...
- hdu2552 (浮点数复杂运算的四舍五入)题解
三足鼎立 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submi ...
- HDU 6129 Just do it(杨辉三角)
http://acm.hdu.edu.cn/showproblem.php?pid=6129 题意: 给出数组a,并且bi=a1^a2^a3...^ai,并且现在会重复m次,求出最后的b数组. 思路: ...