【记忆化搜索】洛谷_3956 棋盘

本文介绍了一种使用记忆化搜索解决特定迷宫问题的方法。该问题要求从起点到终点,通过改变颜色或使用魔法来最小化花费的金币数量。文章详细解释了算法思路,并提供了完整的C++实现代码。

##题意
给出一个m∗mm*mmm的方格,其中有一些格子上有颜色。我们从(1,1)出发,终点是(n,n)。我们每次要站在有颜色的格子上,如果我们接下来走的格子和现在格子的颜色一致,那么就不用花费金币,如果颜色不一致就要花费1金币,如果没有颜色,可以使用魔法来让这个格子变成任意颜色,花费2金币(不能连续使用魔法)。求走到终点花费的最少金币。
##思路
记忆化搜索。用一个数组记录走到这个格子的最少金币,然后每次搜索时就可以剪枝。搜索按正常的打就好了。
##代码

#include<cstdio>
#include<cstring>
using namespace std;
int m,n,a,b,c,map[105][105],ans[105][105],v[105][105];
short dx[4]={0,0,1,-1},dy[4]={1,-1,0,0};
void dfs(int x,int y,int f,int s)
{
    if (ans[x][y]<=s) return;//剪枝
    ans[x][y]=s;//记录答案
    int xx,yy;
    for (int i=0;i<4;i++)
    {
        xx=x+dx[i];yy=y+dy[i];
        if (!map[xx][yy]&&f||(xx<1||xx>n||yy<1||yy>n)||v[xx][yy]) continue;//不能连续使用魔法,在范围内
        v[xx][yy]=1;
        if (map[xx][yy]==map[x][y]) dfs(xx,yy,0,s);//颜色相同直接走
        else if (!map[xx][yy])//使用魔法
        {
            map[xx][yy]=map[x][y];
            dfs(xx,yy,1,s+2);
            map[xx][yy]=0;
        }
        else dfs(xx,yy,0,s+1);//颜色不同消耗1金币
        v[xx][yy]=0;
    }
}
int main()
{
    memset(ans,127/3,sizeof(ans));
    scanf("%d%d",&n,&m);
    while (m--)
    {
        scanf("%d%d%d",&a,&b,&c);
        map[a][b]=c+1;
    }
    dfs(1,1,0,0);
    if (ans[n][n]==707406378) printf("-1");
    else printf("%d",ans[n][n]);
}
要获取用于摄像头标定的黑白棋盘格标定板图像,可以通过多种方式实现。以下是一些推荐的方法: 1. **从开源资源下载现成的标定板图像** 一个包含20张黑白棋盘格标定板图的资源文件已经被提供,适用于单目摄像头的标定工作。该资源文件名为“摄像头标定_黑白棋盘格标定板图20张.zip”,可以从以下链接下载:[摄像头标定黑白棋盘格标定板图20张](https://gitcode.com/open-source-toolkit/ffae3) [^1]。 2. **使用编程语言生成自定义的棋盘格标定图** 可以通过编程语言如Python,结合OpenCV库生成自定义的黑白棋盘格标定图。以下是一个简单的Python代码示例,它可以根据指定的行数和列数生成黑白棋盘格标定图: ```python import cv2 import numpy as np def generate_chessboard(width, height, square_size): # 创建一个空白图像 board = np.zeros((height * square_size, width * square_size), dtype=np.uint8) # 填充黑白棋盘格 for y in range(height): for x in range(width): if (x + y) % 2 == 0: board[y*square_size:(y+1)*square_size, x*square_size:(x+1)*square_size] = 255 return board # 参数设置 x_nums = 9 # 横向棋盘格数 y_nums = 6 # 纵向棋盘格数 square_size = 50 # 每个方格的大小 # 生成棋盘格图像 chessboard = generate_chessboard(x_nums, y_nums, square_size) # 显示图像 cv2.imshow('Chessboard', chessboard) cv2.waitKey(0) cv2.destroyAllWindows() ``` 通过调整`x_nums`和`y_nums`参数的值,可以生成任意数量的黑白格子 [^3]。 3. **自行设计和打印棋盘格标定图** 如果上述两种方法都不适合,可以使用图像处理软件(如Photoshop、GIMP等)手动创建黑白棋盘格图案,并打印出来用于摄像头标定。 以上方法都可以帮助获取用于摄像头标定的黑白棋盘格标定板图像,选择最适合自己的方法即可。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值