洛谷P3956. [NOIP2017. PJ]棋盘
题目简述
红、黄、无
,当你从一个格子走向另一个格子时,同色格子不花费,异色格子花费不能走
,但是可以用魔法将其染成当前所处格子的颜色,花费
解题思路
dfs
求解?
状态表示:
不能用连续的两次魔法
,所以如果这个点是用过魔法的,那转移过去的时候就不能也用魔法
这样一通分析下来,我们
状态转移
对于每个由
可行性剪枝
。
不能连续使用
,不可转移
总结起来就是
剪枝
代码
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 110, INF = 0x3f3f3f3f;
int g[N][N], n, m, dist[N][N];
int dx[4] = {-1, 0, 1, 0}, dy[4] = {0, 1, 0, -1};
void dfs(int x, int y, int cost, int used)
{
if (dist[x][y] <= cost) return ;
dist[x][y] = cost;
if (x == m && y == m) return ;
for (int i = 0; i < 4; i ++ )
{
int nx = x + dx[i], ny = dy[i] + y;
if (nx < 1 || nx > m || ny < 1 || ny > m) continue ;
if (g[nx][ny] == -1)
{
if (used) continue ;
else {
g[nx][ny] = g[x][y];
dfs(nx, ny, cost + 2, 1);
g[nx][ny] = -1;
}
}
else if (g[nx][ny] == g[x][y]) dfs(nx, ny, cost, 0);
else dfs(nx, ny, cost + 1, 0);
}
}
int main()
{
scanf("%d%d", &m, &n);
memset(g, -1, sizeof g);
while (n -- )
{
int a, b, c;
scanf("%d%d%d", &a, &b, &c);
g[a][b] = c;
}
memset(dist, 0x3f, sizeof dist);
dfs(1, 1, 0, 0);
if (dist[m][m] == INF) puts("-1");
else printf("%d\n", dist[m][m]);
return 0;
}
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 【.NET】调用本地 Deepseek 模型
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业