P3956 棋盘
2024-08-30 07:39:39
P3956 棋盘
题解
注释都在代码里了
这道题可以用DFS做,记忆化搜索,维护一个money[ ][ ] 表示到达当前节点的最小花费
不需要记录VIS,因为有一个最小值判断,如果走重复的话一定会得到一个更大的花费,那就直接退出了
代码
#include<bits/stdc++.h> using namespace std; int m,n;
int clor[][],money[][];
//clor是记录颜色的数组 ,0无色,1红色,2黄色
//money是记录走到(x,y)的最少花费
int dx[]={-,,,},dy[]={,-,,};
int x,y,c;
bool flag=; //判断有无解 bool pan(int x,int y)
{
return x>=&&x<=m&&y>=&&y<=m;
} void dfs(int x,int y,int step,bool use)
//走到了(x,y),话费为step,use表示是否使用了魔法
{
if(!pan(x,y)) return; //不合法直接退出
if(step>=money[x][y]) return ;
//最小值判断
//如果走到(x,y)的花费比之前搜到的结果还大,那么直接退出
money[x][y]=step;
//更新成更小花费
if(x==m&&y==m)
{
flag=;
return;
}//有解
for(int i=;i<=;i++) //四连通深搜
{
int xx=x+dx[i],yy=y+dy[i];
if(pan(xx,yy)) //新节点合法
{
if(clor[xx][yy]!=) //新节点有颜色
{
if(clor[xx][yy]==clor[x][y]) //新节点与原来节点同色
dfs(xx,yy,step,); else //新节点与原来节点不同色
dfs(xx,yy,step+,);
}
else if(!use) //新节点无色,没有使用过魔法,可以使用魔法
{
clor[xx][yy]=clor[x][y]; //暂时变色
dfs(xx,yy,step+,);
clor[xx][yy]=; //回溯
}
}
} } int main()
{
scanf("%d%d",&m,&n);
memset(money,0x3f,sizeof(money)); //初始化极大值
for(int i=;i<=n;i++)
{
scanf("%d%d%d",&x,&y,&c);
clor[x][y]=c+;
}
dfs(,,,);
if(flag==)
{
printf("%d\n",money[m][m]);
}
else
{
printf("-1\n");
} return ;
}
最新文章
- ASP.NET跨平台实践:无需安装Mono的Jexus“独立版”
- ComponentOne 2016 V3 发布
- spring security 3.2 配置详解(结合数据库)
- 使用Struts2标签遍历集合
- python——挖装饰器祖坟事件
- Windows 8.1 with update 官方最新镜像汇总
- 什么是automatic variable?
- python核心编程第六章练习6-8
- STL容器的适用情况
- Android笔记——RecyclerView替代ListView
- AOJ 2170 Marked Ancestor (基础并查集)
- hdu 4800 Josephina and RPG
- Android中使用proguardgui混淆jar包
- nyoj 最少步数
- T-SQL 删除重复数据SQL
- hibernate关联对象的增删改查------查
- $.each()和$().each(),以及forEach()的用法
- 第三方工具系列--Lombok常用注解
- vue computed的执行问题
- day22 time模块