标签:
Description
Input
Output
Sample Input
2 1 #. .# 4 4 ...# ..#. .#.. #... -1 -1
Sample Output
2
1
解题思路:
这个题目的大意是给定一个棋盘和给定我们需要摆放的棋子的数目,然后问我们有几种摆放方式。首先我们可以明确这是一个深度搜索的题目,与八皇后问题相似。我们建立一个函数DFS用来累计可行的方案数,我们走过一列我们就把它标记下来下次的时候就不可以再摆放在这一列(因为题目要求不可以将棋子摆放在同一行和同一列)
然后就从下一行开始寻找可行的地方,直到我们摆放的棋子数与我们被要求摆放的棋子数相同时,我们就将方案数进行一次++,然后在进行递归下去。
程序代码:
#include<cstdio> #include <iostream> #include<cstring> using namespace std; int n,k,ans; char map[12][12];//棋盘 int vis[12]; int DFS(int i,int cur) { if(cur>=k) // { ans++; //方案数 return 0; } int x,y; for(x=i;x<n;x++) for(y=0;y<n;y++) if(!vis[y] && map[x][y]==‘#‘) { vis[y]=1;//标记 DFS(x+1,cur+1);//递归 vis[y]=0; } return 0; } int main() { while(scanf("%d%d",&n,&k)&&n!=-1) { ans=0; memset(map,0,sizeof(map)); memset(vis,0,sizeof(vis)); for(int i=0;i<n;i++) scanf("%s",map[i]); DFS(0,0); printf("%d\n",ans); } return 0; }
标签:
原文地址:http://www.cnblogs.com/xinxiangqing/p/4692994.html