Time Limit: 1000MS | Memory Limit: 10000K | |
Total Submissions: 20705 | Accepted: 10272 |
Description
Input
Output
Sample Input
2 1
#. .# 4 4 ...# ..#. .#.. #... -1 -1Sample Output
2 1这道题目类似N皇后问题,与之不同的是每一行不一定有棋盘,所以dfs里要注意不一定是当前行。思路很简单,只需从第一行第一个开始搜索,如果该位置该列没被标记且为棋盘,那么在这里放上棋子,并标记,因为每行每列不能冲突,所以搜索下一行,比并且棋子数加1。每次搜索之前先要判断是否棋子已经用完,如果用完,记录方案数加1,然后直接返回。直到所有搜索全部完成,此时已得到全部方案数。此题还需注意标记数组仅仅标记某一列上是否有棋子,因为每次递归下一行,所以每一行不会有冲突,只需判断这一列上是否有其他棋子。还要注意修改标记后递归回来要及时复原。最近一直在做搜索题,博客也是刚开不久,如有大神路过,希望指点一二。#include<stdio.h> #include<string.h> int n,k,vis[15],ans; char mat[15][15]; void dfs(int cur,int num) { if(num==k) { ans++; return; } for(int i=cur;i<n;i++) for(int j=0;j<n;j++) if(mat[i][j]==‘#‘ && !vis[j]) { vis[j]=1; dfs(i+1,num+1); vis[j]=0; } } int main() { while(~scanf("%d %d%*c",&n,&k) && n!=-1 && k!=-1) { memset(vis,0,sizeof(vis)); int i; for(i=0;i<n;i++) gets(mat[i]); ans=0; dfs(0,0); printf("%d\n",ans); } return 0; }
原文:http://blog.csdn.net/u013923947/article/details/21873117