POJ 1321:棋盘问题
Time Limit: 1000MS | Memory Limit: 10000K | |
Total Submissions: 21666 | Accepted: 10765 |
Description
Input
每组数据的第一行是两个正整数,n k。用一个空格隔开,表示了将在一个n*n的矩阵内描写叙述棋盘,以及摆放棋子的数目。 n <= 8 , k <= n
当为-1 -1时表示输入结束。
随后的n行描写叙述了棋盘的形状:每行有n个字符。当中 # 表示棋盘区域。 . 表示空白区域(数据保证不出现多余的空白行或者空白列)。
Output
Sample Input
2 1
#.
.#
4 4
...#
..#.
.#..
#...
-1 -1
Sample Output
2
1
深搜。
注意k<n的处理。
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream> using namespace std; int n , k;
int chess[10][10];
int vist[10];
int ans; void dfs(int x, int num)
{
if(num==k)
{
ans++;
return ;
}
if(x>n)
return ;
for(int i=1; i<=n; i++)
{
if(chess[x][i]==1 && vist[i]==0)
{
vist[i]=1;
dfs(x+1, num+1);
vist[i]=0; //回溯后还原数据
}
}
dfs(x+1, num);
} int main()
{
char str;
while(scanf("%d%d", &n, &k)!=EOF)
{
memset(chess, 0, sizeof(chess));
memset(vist, 0, sizeof(vist));
ans=0;
if(n==-1 && k==-1)
break;
for(int i=1; i<=n; i++)
for(int j=1; j<=n; j++)
{
cin>>str;
if(str=='#')
chess[i][j]=1;
}
dfs(1, 0);
cout<<ans<<endl;
} return 0;
}
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream> using namespace std; #define max 100 char map[max][max];
int s[max];
int n,k,i,j,a; void dfs(int x,int y) //函数參量表示的意思:x表示该棋盘的第x行,y表示放置第y个棋子
{
int i,j;
if(y==k) // 递归边界
a++;
else
{
for(i=x+1;i<=n;i++) // 按行讨论
{
for(j=1;j<=n;j++) // 从1 到 n列
{
if( map[i][j]=='#' && !s[j] ) // 若该点是 '#'且该点的这一列没有旗子。则能够在该位置放棋子。 {
s[j]=1;
dfs(i,y+1);
s[j]=0;
}
}
}
}
} int main ()
{ while (~scanf("%d%d",&n,&k)&&n!=-1&&k!=-1)
{
a=0;
memset(s,0,sizeof(s));
getchar(); //
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
scanf("%c",&map[i][j]);
getchar(); //
}
dfs(0,0);
printf("%d\n",a);
}
return 0;
}
POJ 1321:棋盘问题的更多相关文章
- POJ 1321 棋盘问题 --- DFS
POJ 1321 题目大意:给定一棋盘,在其棋盘区域放置棋子,需保证每行每列都只有一颗棋子. (注意 .不可放 #可放) 解题思路:利用DFS,从第一行开始依次往下遍历,列是否已经放置棋子用一个数组标 ...
- DFS POJ 1321 棋盘问题
题目传送门 /* DFS:因为一行或一列都只放一个,可以枚举从哪一行开始放,DFS放棋子,同一列只能有一个 */ #include <cstdio> #include <algori ...
- POJ 1321 棋盘问题(C)回溯
Emmm,我又来 POJ 了,这题感觉比上次做的简单点.类似皇后问题.但是稍微做了一点变形,比如棋子数量是不定的.棋盘形状不在是方形等等. 题目链接:POJ 1321 棋盘问题 解题思路 基本思路:从 ...
- OpenJudge/Poj 1321 棋盘问题
1.链接地址: http://bailian.openjudge.cn/practice/1321 http://poj.org/problem?id=1321 2.题目: 棋盘问题 Time Lim ...
- POJ 1321 棋盘问题(DFS板子题,简单搜索练习)
棋盘问题 Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 44012 Accepted: 21375 Descriptio ...
- POJ 1321 - 棋盘问题 - [经典DFS]
题目链接:http://poj.org/problem?id=1321 Time Limit: 1000MS Memory Limit: 10000K Description 在一个给定形状的棋盘(形 ...
- poj 1321 棋盘问题 递归运算
棋盘问题 Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 19935 Accepted: 9933 Description ...
- poj 1321 棋盘问题 简单DFS
题目链接:http://poj.org/problem?id=1321 很久没有敲搜索了啊,今天敲了个水题练练手,哈哈.... 题目大意: 就是求在n*n的方格上放置k个棋子的方案数 代码: #inc ...
- POJ 1321 棋盘问题(状态压缩DP)
不总结的话, 同一个地方会 WA 到死 思路: 状态压缩 DP. 1. s 表示压缩状态, 若第 i 列放了棋子, 那么该列置 1, 否则该列置 0. 假如 s = 3(0x011) 那么表示棋盘的第 ...
- POJ 1321 棋盘问题 dfs 难度:0
http://poj.org/problem?id=1321 注意是在'#'的地方放棋子 矩阵大小不过8*8,即使是8!的时间复杂度也足以承受,可以直接dfs求解 dfs时标注当前点的行和列已被访问, ...
随机推荐
- 【资料】wod烟草
注意: 1. 所有效果持续时间是整个地城 2. 某几样菸草在使用 烟雾的祝福 的时候效果只有LV1 (技能 -25), 表示该物品设计上主要是自己使用而非加给团队. SL = 技能等级 HL = 英雄 ...
- Multiline ComboBox
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- iOS:上线的基本流程
1.创建唯一标书符App ID 首先打开开发者网站,进入证书页面,我们点击Identifiers下边App IDs选项,然后点击右上角加号,如图: 2.申请发布证书 我们点击Certificates下 ...
- SRM 212 Div II Level One: YahtzeeScore
题目来源:http://community.topcoder.com/stat?c=problem_statement&pm=1692&rd=5858 比较简单. 代码如下: #inc ...
- 初见-TensorRT简介<转>
下面是TensorRT的介绍,也可以参考官方文档,更权威一些:https://developer.nvidia.com/tensorrt 关于TensorRT首先要清楚以下几点: 1. TensorR ...
- windows删除或修改本地Git保存的账号密码
windows删除或修改本地Git保存的账号密码 学习了:https://blog.csdn.net/xudailong_blog/article/details/78798118 (一)进入控制面板 ...
- (转)LIB和DLL的区别与使用
共有两种库:一种是LIB包含了函数所在的DLL文件和文件中函数位置的信息(入口),代码由运行时加载在进程空间中的DLL提供,称为动态链接库dynamic link library.一种是LIB包含函数 ...
- java中 this和super的差别
this表示当前调用方法的对象的引用: (谁调用这种方法,谁就是这个对象,这个this就是它的引用) 比方: <pre name="code" class="jav ...
- Thinkpad X201 Gobi2000 上电信3G网络
网上的教程大多有点小问题,许多都不完整,今天放出系统化.理论化的设置方法,附送上所有软件. 一.本教程适用范围:1.gobi 2000 正式版 FRU:60Y3263 (带MEID.IMEI)2.- ...
- (C++)C++类继承中的构造函数和析构函数
思想: 在C++的类继承中, 建立对象时,首先调用基类的构造函数,然后在调用下一个派生类的构造函数,依次类推: 析构对象时,其顺序正好与构造相反: 例子: #include <iostream& ...