openjudge_2.5基本算法之搜索_323:棋盘问题

问题

323:棋盘问题
总时间限制: 1000ms 内存限制: 65536kB
描述
在一个给定形状的棋盘(形状可能是不规则的)上面摆放棋子,棋子没有区别。要求摆放时任意的两个棋子不能放在棋盘中的同一行或者同一列,请编程求解对于给定形状和大小的棋盘,摆放k个棋子的所有可行的摆放方案C。
输入
输入含有多组测试数据。
每组数据的第一行是两个正整数,n k,用一个空格隔开,表示了将在一个n*n的矩阵内描述棋盘,以及摆放棋子的数目。 n <= 8 , k <= n
当为-1 -1时表示输入结束。
随后的n行描述了棋盘的形状:每行有n个字符,其中 # 表示棋盘区域, . 表示空白区域(数据保证不出现多余的空白行或者空白列)。
输出
对于每一组数据,给出一行输出,输出摆放的方案数目C (数据保证C<2^31)。
样例输入
2 1
#.
.#
4 4
…#
…#.
.#…
#…
-1 -1
样例输出
2
1

理解

  • 问的只是方案数
  • “# 表示棋盘区域, . 表示空白区域”,这句容易产生歧义。棋盘不是完整的矩形,中间有缺失部分。#是棋盘的空白区域,.是缺失部分(可以理解为一块洞)。
  • 跟八皇后差不多。八皇后是8个棋子,该次是棋子少于等于行数。每一行开始,放完k个棋子就是一种方案。

代码

#include <bits/stdc++.h>
using namespace std;
int n,m,he;
char c[10][10];
bool k[10];//记住哪一列用过了
void go(int hx,int mx){//递归,从哪一行开始,放了几个棋子
if(mx>m){he++;return;}//递归出口,放了m个棋子就多种方案数
for(int i=hx;i<=n;i++)//从hx行开始逐一尝试从余下行开始
for(int j=1;j<=n;j++)//每个列都尝试
if(!k[j]&&c[i][j]= =‘#’){//该列空,且非缺失部分,可以放
k[j]=1;//该分支递归结束前都要标记
//view(1);
go(i+1,mx+1);//hx+1的话,就是hx+1重复n次
k[j]=0;//回溯,取消标记
}
}
int main(){
//freopen(“data.cpp”,“r”,stdin);
while(cin>>n>>m&&!(n==-1&&m==-1)){
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
cin>>c[i][j];//直接输入字符
}
}
//view(0);
memset(k,0,sizeof(k));
he=0;go(1,1);
cout<<he<<endl;
}
return 0;
}

小结

  • 深搜要用递归
  • 递归貌似循环,其实要在深一层进行。就像要做饭,先有个整体思路,发现没菜,就先去找到菜,再去进一步。是完全符合代码的顺序结构,但是递归是在深一层进行,递归回来了再继续剩余操作。
  • 八皇后是要遍历每列,完了递归下一行。因为只能从第一行开始。
  • 该题是每一行都可以开始。
  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
模拟退火算法和粒子群算法都是常用的优化方法,尤其在解决路径优化问题时,它们可以应用于寻找全局最优解。 1. **模拟退火算法**[^2]: 模拟退火算法是一种启发式搜索算法,它模仿了金属冷却过程中的相变现象。在路径优化中,初始解(通常是随机生成的)作为“热”的状态,随着迭代的进行,算法会接受可能较差的解(类似于高能量状态),但以一定的概率接受“冷却”(即接受更低适应度的解,但有概率跳出当前最优解的局部最优)。这样可以在一定程度上避免陷入局部最优。 2. **粒子群算法**[^1]: 粒子群算法(Particle Swarm Optimization, PSO)则是基于群体行为的优化方法。每个粒子代表一个解,它们通过飞行速度和最佳位置信息更新自己的位置,同时群体共享全局最佳位置。在路径优化中,粒子们会在搜索空间中移动,尝试找到最优路径。PSO通常用于大规模问题,通过集体协作找到全局最优解。 为了演示这两种算法,通常需要编写代码实现,例如在MATLAB中可能会这样设计: ```matlab % 模拟退火算法 while not(converged) new_solution = ... % 更新解的过程 if fitness(new_solution) > current_fitness current_solution = new_solution; elseif rand < acceptance_probability current_solution = new_solution; end end % 粒子群算法 for iteration = 1:max_iterations update_particle_positions_and_velocities(); global_best = ... % 更新全局最佳位置 end ``` 请确保在实际应用中,具体实现细节会依赖于问题的具体描述,包括目标函数、约束条件等。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值