首页 > 代码库 > poj 1321 棋盘问题 (dfs)
poj 1321 棋盘问题 (dfs)
链接:poj 1321
题意:给定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; }
poj 1321 棋盘问题 (dfs)
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。