题意:给定n*n的棋盘, # 代表棋盘区域,可以放棋子,
.代表空白区域(不能放棋子),现要摆放k个棋子,求方案数.
要求:摆放时任意的两个棋子不能放在棋盘中的同一行或者同一列
思路:因为任意两个棋子不能在同一行或同一列,可以逐行dfs,并对已访问的行标记
#include<stdio.h> #include<string.h> char s[10][10]; __int64 cnt; int sum,n,m,vis[10]; void dfs(int r) { int i,j; for(i=r+1;i<n;i++) //从该行往下dfs for(j=0;j<n;j++) if(s[i][j]=='#'&&!vis[j]){ sum++; vis[j]=1; //访问后标记为1 if(sum==m) cnt++; else dfs(i); sum--; //回溯 vis[j]=0; } } int main() { int i,j; while(scanf("%d%d",&n,&m)!=EOF){ if(m==-1&&n==-1) break; cnt=0; for(i=0;i<n;i++) scanf("%s",s[i]); for(i=0;i<n;i++) for(j=0;j<n;j++){ memset(vis,0,sizeof(vis)); //先初始化为0 if(s[i][j]=='#'){ //每找到一个可以放棋子的地方,就进行dfs sum=1; vis[j]=1; if(sum==m){ cnt++; continue; } dfs(i); } } printf("%I64d\n",cnt); } return 0; }
原文地址:http://blog.csdn.net/acm_code/article/details/39430515