好吧本来这题可以用最短路跑完的,结果我硬是打了1.5小时的dfs。。。

其实这题并没有那么难,构造一个无向图再跑最短路即可。

我用的dj跑最短路

问题来了

如果(n,n)是无色的,那么图上就没有这个点

可以构造一个变量flag记录点(n,n)是否有颜色

若flag==0,则在地图上新加一个点。

点与点间的路程情况:

  1. 相邻且颜色相同,z[i][j]=0;

  2. 相邻且颜色不同,z[i][j]=1;

  3. 相隔一格且颜色相同,z[i][j]=2;

  4. 相隔一格且颜色不同,z[i][j]=3;

∴点i与点j的距离=其颜色差的绝对值+位置差(是否使用膜法)

if(abs(x[i]-x[j])+abs(y[i]-y[j])==1){z[i][j]=z[j][i]=abs(col[i]-col[j]);}if(abs(x[i]-x[j])+abs(y[i]-y[j])==2)z[i][j]=z[j][i]=2+abs(col[i]-col[j]);

献上代码:

#include<bits/stdc++.h>
using namespace std;
bool f[1002];
int n,m,x[1002],y[1002],z[1002][1002],col[1002],sta,en,flag,s[1002];
void dj(int k)
{s[k]=0;int maxn,t;for(int i=1;i<=m;i++){maxn=99999999;for(int j=1;j<=m;j++)                 {if(f[j]==0&&s[j]<maxn){maxn=s[j];t=j;}}f[t]=1;for(int j=1;j<=m;j++){s[j]=min(s[t]+z[t][j],s[j]);}}
}
int main()
{//freopen("chess.in","r",stdin);//freopen("chess.out","w",stdout);memset(z,1,sizeof(z));memset(s,1,sizeof(s));scanf("%d%d",&n,&m);for(int i=1;i<=m;i++){scanf("%d%d%d",&x[i],&y[i],&col[i]);if(x[i]==1&&y[i]==1){sta=i;}if(x[i]==n&&y[i]==n){flag=1;en=i;}}if(flag==0){en=m+1;x[en]=y[en]=n;}for(int i=1;i<m;i++){for(int j=i+1;j<=m;j++){if(abs(x[i]-x[j])+abs(y[i]-y[j])==1){z[i][j]=z[j][i]=abs(col[i]-col[j]);}if(abs(x[i]-x[j])+abs(y[i]-y[j])==2)z[i][j]=z[j][i]=2+abs(col[i]-col[j]);}}if(flag==0){for(int i=1;i<=m;i++){if(abs(x[i]-x[en])+abs(y[i]-y[en])==1){z[i][en]=z[en][i]=2;}}m++;}dj(sta); if(s[en]<16843009)cout<<s[en];elsecout<<-1;return 0;
}

转载于:https://www.cnblogs.com/lost-in-tianyi/p/10589191.html

题解 guP3956 棋盘相关推荐

  1. 题解 guP3956 【棋盘】

    好吧本来这题可以用最短路跑完的,结果我硬是打了1.5小时的dfs... 其实这题并没有那么难,构造一个无向图再跑最短路即可. 我用的dj跑最短路 问题来了 如果(n,n)是无色的,那么图上就没有这个点 ...

  2. [网络流24题][BZOJ1475]方格取数(最小割)

    题目描述 传送门 题解 讲棋盘进行黑白染色,从超级源向所有黑点连边,容量为num:从所有白点向超级汇连边,容量为num:再从所有的黑点向与之相邻的白点连边,容量为INF. 求最小割(最大流)即为答案. ...

  3. Leetcode 773. 滑动谜题 C++

    Leetcode 773. 滑动谜题 题目 在一个 2 x 3 的板上(board)有 5 块砖瓦,用数字 1~5 来表示, 以及一块空缺用 0 来表示. 一次移动定义为选择 0 与一个相邻的数字(上 ...

  4. luogu P1549 棋盘问题(2) 题解

    luogu P1549 棋盘问题(2) 题解 题目描述 在\(N * N\)的棋盘上\((1≤N≤10)\),填入\(1,2,-,N^2\)共\(N^2\)个数,使得任意两个相邻的数之和为素数. 例如 ...

  5. 数据结构——马踏棋盘题解(贪心算法)

    本文转自: https://blog.csdn.net/qq_41596568/article/details/83060317 数据结构--马踏棋盘题解(贪心算法) 使用循环建立棋盘与权值棋盘(权值 ...

  6. AcWing321.棋盘分割(区间DP)题解

    棋盘分割 题目传送门 题目描述 将一个8*8的棋盘进行如下分割:将原棋盘割下一块矩形棋盘并使剩下部分也是矩形,再将剩下的部分继续如此分割,这样割了(n-1)次后,连同最后剩下的矩形棋盘共有n块矩形棋盘 ...

  7. 蓝桥 卷“兔”来袭编程竞赛专场-05棋盘加密 题解

    赛题介绍 挑战介绍 棋盘密码是一种坐标加密法.棋盘密码通过将 26 个字母设法变成十位数来达到加密的目的,密钥是一个 5×5 的棋盘,将 26 个英文字母填在棋盘的格子里,其中 i 和 j 在同一个方 ...

  8. 数据结构——马踏棋盘题解(贪心算法)(C语言)

    数据结构--马踏棋盘题解(贪心算法) 使用循环建立棋盘与权值棋盘(权值为该位置可走的位置数量) 将当前步数写入棋盘数组中 开始探测下一步该走的位置, 分别测试八个方向 对可走位置进行查询权值,将权值最 ...

  9. 【寒假每日一题】棋盘挑战(个人练习)详细题解+推导证明(第十六天)

    文章目录 前言 题目 详细题解 写法1 推导证明 举一反三 总结 前言 今天是经典的深度优先搜索问题,即八皇后问题. 作为经典问题,我发现了一种新的写法,不需要开二维数组即可完成. 题目 给定一个 N ...

最新文章

  1. 非人哉恰饭的九月最美丽,只有啸天是菜鸡,上班睡觉太厉害了
  2. how is my appointment opened in HCP
  3. Rabbitmq如何设置优先级队列?如何限流?如何重试?如何处理幂等性?
  4. 小Z的袜子(BZOJ-2038)
  5. ChatOps如何变革企业业务
  6. GitHub客户端 Desktop使用
  7. linux vi命令怎么使用方法,Linux下 vi 命令用法
  8. 服务器搭建bbr加速
  9. solidity[4]-pure与view剖析
  10. maya中英文对比_[转载]maya中英文对照
  11. JavaScript 更新Dom节点
  12. source-map
  13. Jetson Xavier NX——重新刷系统
  14. android模拟器 对比,安卓模拟器多开用哪个模拟器好?实测数据对比哪个好用
  15. [日更-2019.4.26、27、28] cm-14.1 Android系统启动过程分析(四)-应用程序进程启动过程...
  16. 使用three.js + geojson 完成广西地图的绘制(上篇)
  17. 斯坦福CS234增强学习——(1)简介
  18. oracle单用户,如何将系统引导至单用户状态(运行级别 S)
  19. nCode DesignLife实体焊缝疲劳分析
  20. Web前端开发技术课程大作业——HTML5旅游景区景点(13页面)HTML+CSS+JavaScript

热门文章

  1. 海信ULED超高清电视全网首发
  2. mysql查询 31到40_sql语句,取出表A中的第31条到40条记录
  3. 认识多帧1:多帧图像复原算法研究
  4. 【小demo】——直播平台自动发言
  5. 2016计算机价格,2016年2月中国电脑整机行业价格指数走势
  6. 新基建浪潮来袭 企业快速上云应一切从“简”
  7. 使用双视场测量工件长度尺寸
  8. oracle 数据库 decode()用法 sign()用法 rownum用法 tjd面试真题
  9. win10 C盘扩容(系统自带磁盘管理功能受限时,请尝试此方法,亲测有效)
  10. 小程序分账系统能够解决哪些问题呢?