制作地图
制作地图
贝茜正在学习制作扫雷地图。
作为初学者,它打算先从简单的一维地图做起,它准备制作一张 大小的地图(即 的方格矩阵)。
地图中含有地雷的方格,应标记为 *
;不含地雷的方格,应标记为一个 到 之间的数字,用来表示其相邻方格中的地雷数量。
例如,001*2*
是一个合法的地图,因为每个数字的相邻 *
的数量与数字本身均保持一致;2*
是一个不合法的地图,因为数字 2
的相邻 *
的数量只有 。
给定贝茜正在制作的地图,地图中的若干( 个或更多)方格已被标记,其余( 个或更多)方格尚未标记。
请你计算,如果将所有尚未标记的方格全部标记完毕,一共可能得到多少种不同的合法地图。
注意,已被贝茜标记的部分不一定保证合法,所以很有可能根本得不到任何合法地图。
输入格式
共一行,包含一个长度为 的字符串,其中第 个字符用来表示第 个方格的状态。
字符串中只可能包含字符 *
、0
、1
、2
、?
,其中 *
、0
、1
、2
的含义如题面描述,?
表示方格尚未标记。
输出格式
一个整数,表示可以得到的不同的合法地图的数量。
由于结果可能很大,请你输出对 取模后的结果。
数据范围
前 个测试点满足 。
所有测试点满足 。
输入样例1:
?01???
输出样例1:
4
输入样例2:
?
输出样例2:
2
输入样例3:
**12
输出样例3:
0
输入样例4:
1
输出样例4:
0
解题思路
用数字 ,, 来分别字符 0
,1
,2
。用数字 来表示 *
。
考虑 dp,当确定了第 个位置的字符后,此时就可以判断第 个位置上的字符是否合法(左右两边的字符都已经确定)。定义状态 表示由前 个字符构成,且第 个位置上的字符都合法,第 个位置上的字符是 , 第 个位置上的字符是 的所有合法方案的数量。此时第 和 个位置上的字符已经确定,根据第 个字符 是什么来进行状态转移。当 即第 个位置上的字符是 *
,那么不管左右两边是什么字符第 个位置上的 *
都合法,因此 可以通过 转移得到。如果 即第 个位置上的字符是数字,那么只有左右两边 *
的数量恰好等于 ,第 个位置上的字符才合法,此时 可以通过 转移得到。
另外为了方便字符串的下标从 开始,由于第 个位置和第 个位置上没有雷,这里默认都用 0
来表示(只要不是 3
即可)。同时状态的第一维 枚举到 ,最后统计答案的时候只用统计 即可。
AC 代码如下,时间复杂度为 :
#include <bits/stdc++.h>
using namespace std;
const int N = 1e6 + 10, mod = 1e9 + 7;
char s[N];
int f[N][4][4];
string mp = "012*";
int main() {
scanf("%s", s + 1);
int n = strlen(s + 1);
s[n + 1] = '0';
for (int i = 0; i <= 3; i++) {
if (s[1] == '?' || s[1] == mp[i]) f[1][0][i] = 1;
}
for (int i = 2; i <= n + 1; i++) {
for (int j = 0; j <= 3; j++) {
if (s[i - 1] == '?' || s[i - 1] == mp[j]) {
for (int k = 0; k <= 3; k++) {
if (s[i] == '?' || s[i] == mp[k]) {
for (int u = 0; u <= 3; u++) {
if (j == 3) f[i][j][k] = (f[i][j][k] + f[i - 1][u][j]) % mod;
else if (j == (u == 3) + (k == 3)) f[i][j][k] = (f[i][j][k] + f[i - 1][u][j]) % mod;
}
}
}
}
}
}
int ret = 0;
for (int i = 0; i <= 3; i++) {
ret = (ret + f[n + 1][i][0]) % mod;
}
printf("%d", ret);
return 0;
}
参考资料
AcWing 5365. 制作地图(AcWing杯 - 周赛):https://www.acwing.com/video/5275/
本文来自博客园,作者:onlyblues,转载请注明原文链接:https://www.cnblogs.com/onlyblues/p/17961348
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探
· 为什么 退出登录 或 修改密码 无法使 token 失效
2023-01-12 Number of Great Partitions
2023-01-12 Count Pairs With XOR in a Range