P6370 [COCI2006-2007#6] KAMEN 题解
暴力是很容易的,可以直接搜索。
发现可以直接对暴力进行优化。每次有一个地方变为 O
后,重构代价太大,设这个坐标为 pair<int, int>
的
为什么这样的时间复杂度是对的呢?因为每次
但是这样空间是 O
所在的位置一定是所有路径的终点,所以就不用记录 pop
即可。
时间复杂度:
空间复杂度:
代码:
mt19937_64 rng(35);
constexpr int N = 3e4 + 10;
int n, m, q;
int tp[35], pa[35][N];
char ch[N][35];
void work(int x) {
while(1) {
int y = pa[x][tp[x]];
if(ch[tp[x]][y] == 'O') --tp[x];
else if(tp[x] == n) break;
else if(ch[tp[x] + 1][y] == 'X') break;
else if(ch[tp[x] + 1][y] == '.') pa[x][++tp[x]] = y;
else if(y > 1 && ch[tp[x]][y - 1] == '.' && ch[tp[x] + 1][y - 1] == '.') pa[x][++tp[x]] = y - 1;
else if(y < m && ch[tp[x]][y + 1] == '.' && ch[tp[x] + 1][y + 1] == '.') pa[x][++tp[x]] = y + 1;
else break;
}
ch[tp[x]][pa[x][tp[x]]] = 'O';
}
int main() {
ios :: sync_with_stdio(0);
cin.tie(0); cout.tie(0);
cin >> n >> m;
for(int i = 1; i <= n; ++i)
for(int j = 1; j <= m; ++j)
cin >> ch[i][j];
for(int i = 1; i <= m; ++i)
pa[i][tp[i] = 0] = i;
cin >> q;
for(int qi = 1; qi <= q; ++qi) {
int x;
cin >> x;
work(x);
}
for(int i = 1; i <= n; ++i) {
for(int j = 1; j <= m; ++j)
cout << ch[i][j];
cout << "\n";
}
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现