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\n",sum); } return 0; }
小结一下:
此题是一道经典的深搜题,不过开始做的时候可能不会做,没有思路,多读几遍题,是在不行看看其他博主的博客,这道题还是能AC的。