POJ1321 棋盘问题 kaungbin-搜索入门-A
2017-07-29 23:19
218 查看
题目链接:POJ1321
题目大意:
给你一个nxn的棋盘(有的位置空缺”.”,有的位置能放棋子“#”),要求你在棋盘能放棋子的地方放k个棋子,要求任意两个棋子,不能同行也不能同列,输出所有可能方案。
简单DFS,代码借鉴 原代码地址
因为本人刚刚接触这部分,所以对每一行代码加了注释,希望你能看懂- -
AC代码
题目大意:
给你一个nxn的棋盘(有的位置空缺”.”,有的位置能放棋子“#”),要求你在棋盘能放棋子的地方放k个棋子,要求任意两个棋子,不能同行也不能同列,输出所有可能方案。
简单DFS,代码借鉴 原代码地址
因为本人刚刚接触这部分,所以对每一行代码加了注释,希望你能看懂- -
AC代码
/* 2017年7月29日22:53:39 POJ1321 简单搜索 kuangbin专题一 A AC */ #include<stdio.h> int n,k,ans; const int maxn=10; char pic[maxn][maxn];//记录棋盘 int col[maxn];//如果该列有棋子则置为1,否则为0 void dfs(int begin,int num){ for(int j=0;j<n;j++){ /* 满足放棋子的条件 当前棋盘可放&&当前列没有棋子 */ if(pic[begin][j]=='#'&&col[j]==0){ if(num==1)//如果走到当前位置,并且只剩下一个棋子没有落下的时候,答案+1 ans++; else{ //否则,将该位置放下棋子 col[j]=1; /* 从下一行开始递归 h 代表行号 h 的范围 为从当前行 往下在填充 num-1行 n-1-(num-1)+1=n-num+1 */ for(int h=begin+1;h<=n-num+1;h++){ dfs(h,num-1); } /* 如果走到这一步,证明已经从之前的递归跳回来 那么就将当前放下的棋子,拿走,即状态清空 */ col[j]=0; } } } } int main(){ while(scanf("%d%d",&n,&k)==2&&n!=-1){ ans=0; /*一行一行的读入数据 */ for(int i=0;i<n;i++){ scanf("%s",pic[i]); } /* 将每一列初始化为0 */ for(int i=0;i<n;i++){ col[i]=0; } /* 棋盘行号标记为0- n-1 从上往下,i从0 取到 n-k 因为如果i=n-k的时候,剩下的 n-1-(n-k)=k-1行 必须填满棋子,所以 i 的取值范围为【0,n-k】 */ for(int i=0;i<=n-k;i++){ dfs(i,k); } printf("%d\n",ans); } return 0; }
相关文章推荐
- POJ1321棋盘问题 搜索基础题
- POJ - 1321 棋盘问题 [kuangbin带你飞]专题一 简单搜索
- POJ 1321 棋盘问题类似八皇后 dfs搜索
- [kuangbin带你飞]专题一 简单搜索 A - 棋盘问题(POJ 1321)
- POJ 1321-棋盘问题 简单搜索DFS
- poj 1321棋盘问题(搜索)
- poj 1321 棋盘问题 dfs搜索
- POJ 1321 棋盘问题(搜索)
- POJ - 1321 棋盘问题(15.10.10 搜索专题)dfs
- poj 1321 棋盘问题 搜索
- POJ 1321棋盘问题(简单搜索)
- [kuangbin带你飞]专题1 简单搜索 A - 棋盘问题 POJ - 1321
- POJ 1321 棋盘问题(简单搜索)
- POJ 1321 棋盘问题---[kuangbin带你飞]专题一 简单搜索
- POJ-1321-棋盘问题(搜索)
- POJ 1321【棋盘问题】 简单搜索
- poj1321--棋盘问题(搜索练习2,变形的八皇后问题)
- Poj 1321 棋盘问题(搜索)
- POJ 1321 经典棋盘问题 的搜索和状态压缩解法
- 【简单搜索】POJ1321棋盘问题