1321:棋盘问题(深度优先搜索进阶)
Posted yhh520
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了1321:棋盘问题(深度优先搜索进阶)相关的知识,希望对你有一定的参考价值。
题目链接:http://bailian.openjudge.cn/practice/1321?lang=en_US
题意:
求在一个n*n的矩阵内棋盘内摆放k个棋子的方案,这些棋子不在同一行不在同一列去
思路:可以通过深度优先搜索去搜寻每一行棋子与其他棋子摆放的可能方法数。
代码如下:
#include<stdio.h> #include<string.h> #include<iostream> using namespace std; char mp[10][10]; int vis[10];//记录每行棋子是否被搜索过 int sum,n,k,cnt; void dfs(int h) { if(cnt==k) { sum++;//满足条件方案数加一 return; } if(h>k)//边界条件 return; for(int i=0;i<n;i++) { if(!vis[i]&&mp[h][i]==‘#‘) { vis[i]=1; cnt++;//满足条件棋子数加一。 dfs(h+1);//然后在下一行放棋子 vis[i]=0;//如果深搜失败或者棋子数目够了,则撤销标记。 cnt--; } } dfs(h+1);//从下一行开始深搜。 } int main(void) { while(cin>>n>>k) { if(n==-1&&k==-1) break; sum=0;//初始化方案数 cnt=0; memset(vis,0,sizeof vis); for(int i=0;i<n;i++) { for(int j=0;j<n;j++) { cin>>mp[i][j]; } } dfs(0);//从第一行开始搜索。 printf("%d ",sum); } return 0; }
小结一下:
此题是一道经典的深搜题,不过开始做的时候可能不会做,没有思路,多读几遍题,是在不行看看其他博主的博客,这道题还是能AC的。
以上是关于1321:棋盘问题(深度优先搜索进阶)的主要内容,如果未能解决你的问题,请参考以下文章