Compare commits

..

3 Commits

Author SHA1 Message Date
522e869e7b refactor(P1896.cpp): 移除未使用的头文件以简化代码
移除<cstdio>和<string>头文件,这些在当前实现中未被使用,减少不必要的依赖
2025-08-30 17:01:49 +08:00
88a1760e0d fix(P1896): 修复循环条件错误和逻辑错误
修复循环条件中缺少自增运算符的问题
修正变量名错误导致的逻辑问题
移除调试用的注释代码
2025-08-30 16:59:18 +08:00
505d9e9c4d feat: 添加P1896.cpp解决棋盘放置问题
实现动态规划算法解决棋盘上放置不互相攻击的国王问题。使用三维数组存储状态,通过位运算检查合法位置,并计算所有可能的放置方案总数。
2025-08-30 16:42:52 +08:00
2 changed files with 89 additions and 0 deletions

78
src/8/30/P1896.cpp Normal file
View File

@ -0,0 +1,78 @@
#include <cstdint>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <istream>
#include <vector>
using ll = int64_t;
ll n,K;
std::vector<ll> line;
std::vector<std::vector<std::vector<ll>>> dp;
static inline constexpr ll get1n(ll x){
return __builtin_popcount(x);
}
int main(){
std::iostream::sync_with_stdio(false);
std::cin.tie(nullptr);
std::cin>>n>>K;
// std::cout<<n<<" "<<K<<"\n";
line.reserve(n*n+1);
line.push_back(0);
for(ll msk=0;msk<(1ll<<n);++msk){
for(ll i=1;i<=n;i++){
if((msk>>i)&1){
if((msk>>(i-1))&1 || msk>>(i+1)&1){
goto nxt;
}
}
}
line.push_back(msk);
nxt:;
}
// for(ll i:line){
// char buff[10];
// memset(buff, 0, sizeof(buff));
// itoa(i, buff, 2);
// printf("%s\n",buff);
// }
dp.resize(n+1,std::vector<std::vector<ll>>(line.size(),std::vector<ll>(K+1)));
for(ll j=1;j<line.size();j++){
ll num1 = get1n(line[j]);
if(num1>K)continue;
dp[1][j][num1]=1;
}
for(ll i=2;i<=n;i++){
for(ll j=1;j<line.size();j++){
ll cur1n = get1n(line[j]);
for(ll k=1;k<line.size();k++){
ll k1n = get1n(line[k]);
if(k1n+cur1n>K)continue;
if(
line[j] & line[k]
|| line[j] & (line[k]<<1)
|| line[j] & (line[k]>>1)
){
continue;
}else{
for(ll x=cur1n;x<=K;x++){
dp[i][j][x]+=dp[i-1][k][x-cur1n];
}
}
}
}
}
ll ans=0;
for(ll j=1;j<line.size();j++){
ans+=dp[n][j][K];
}
std::cout<<ans<<"\n";
}

11
src/8/30/P1896_pai.cpp Normal file
View File

@ -0,0 +1,11 @@
#include <iostream>
#include <random>
std::random_device rd{};
std::mt19937 mt{rd()};
int main(){
std::uniform_int_distribution uni1{1,9}, uni2{1,81};
std::cout<<uni1(mt)<<" "<<uni2(mt)<<"\n";
}