poj 1321 棋盘问题
2015-10-25 20:57
253 查看
题目链接:http://poj.org/problem?id=1321
题意: n*n的棋盘,放k个棋子,#可以放棋子 .不可以放棋子 每行每列都只能有一个棋子,求方案数
分类:DFS
注意点:2的31次方是2147483648,是超过int范围的
代码:
题意: n*n的棋盘,放k个棋子,#可以放棋子 .不可以放棋子 每行每列都只能有一个棋子,求方案数
分类:DFS
注意点:2的31次方是2147483648,是超过int范围的
代码:
///#include<bits/stdc++.h> #include<stdio.h> #include<iostream> #include<string.h> using namespace std; #define LL __int64 #define PI 3.1415926535898 const LL inf=1000000007; int n,k; char ch[10][10]; bool hang[10]; bool lie[10]; int sum_k,temp_ans; LL ans; void dfs(int x,int temp_k) { if(temp_k==k) { ans++; } for(int i=x;i<=n;i++) { for(int j=1;j<=n;j++) { if(ch[i][j]=='.') continue; if(hang[i]==1||lie[j]==1) continue; if(ch[i][j]=='#') { hang[i]=1; lie[j]=1; temp_k++; dfs(i+1,temp_k); temp_k--; hang[i]=0; lie[j]=0; ch[i][j]='#'; } } } } int main() { while(scanf("%d %d",&n,&k)&&!(n==-1&&k==-1)) { ans=0; for(int i=1;i<=n;i++) { for(int j=1;j<=n;j++) { cin>>ch[i][j]; } } for(int i=1;i<=n;i++) { for(int j=1;j<=n;j++) { memset(hang,0,sizeof(hang)); memset(lie,0,sizeof(lie)); int sumk=0; if(ch[i][j]=='#') { ch[i][j]='.'; hang[i]=1; lie[j]=1; sumk++; dfs(i+1,sumk); } } } cout<<ans<<endl; } return 0; }
相关文章推荐
- OOD沉思录 --- 面向动作与面向对象 --- 避免全能类
- map()3
- 函数探讨
- FiddlerCoreAPI 使用简介
- c++和java的区别
- OOD沉思录 --- 继承
- 网页复制回车 替换为word的回车
- 解决/阻止 div层内的div层点击事件冒泡触发的小方法
- LEETCODE-Count and Say
- DOM常用对象
- 关于makefile的=: =? =+区别
- 【机器学习算法】之决策树
- 公钥和私钥
- 工厂模式
- OOD沉思录 --- 导引
- TypeScript学习笔记(四):函数
- 基于Theano的深度学习(Deep Learning)框架Keras学习随笔-18-Noise Layers
- 数据库范式
- 拓扑排序
- 嵌入式Linux根文件系统构建