poj 1321
2016-09-14 15:45
253 查看
思路是:dfs有两个参数 checkerNum 和 raw。checkerNum是棋子数量,raw是行号 。
先从第一行开始遍历,对第一行属于棋盘的每一列:开始下一行。
这一行处理完了,从下一行重新开始dfs。
#include <stdio.h>
int n, k, i, j, ans;
char maze[10][10];
int column[10];
void dfs(int checkerNum, int raw) { //checkerNum是棋子数量,raw是行号
if(checkerNum == k) {
ans++;
return;
}
if(raw >=n) return;
for(int t=0; t<n; t++) {
if(maze[raw][t] == '#' && column[t] == 0) {
checkerNum++;
column[t] = 1;
dfs(checkerNum, raw + 1); //继续下一行
column[t] = 0;
checkerNum--;
}
}
dfs(checkerNum, raw + 1); //第raw行结束。从下一行重新开始
}
int main() {
while(~scanf("%d%d", &n, &k)) {
if(n==-1 && k==-1) break;
getchar();
for(i=0; i<n; i++) {
for(j=0; j<n; j++)
scanf("%c", &maze[i][j]);
getchar();
}
ans = 0;
dfs(0, 0); //从第一行开始
printf("%d\n", ans);
}
return 0;
}
先从第一行开始遍历,对第一行属于棋盘的每一列:开始下一行。
这一行处理完了,从下一行重新开始dfs。
#include <stdio.h>
int n, k, i, j, ans;
char maze[10][10];
int column[10];
void dfs(int checkerNum, int raw) { //checkerNum是棋子数量,raw是行号
if(checkerNum == k) {
ans++;
return;
}
if(raw >=n) return;
for(int t=0; t<n; t++) {
if(maze[raw][t] == '#' && column[t] == 0) {
checkerNum++;
column[t] = 1;
dfs(checkerNum, raw + 1); //继续下一行
column[t] = 0;
checkerNum--;
}
}
dfs(checkerNum, raw + 1); //第raw行结束。从下一行重新开始
}
int main() {
while(~scanf("%d%d", &n, &k)) {
if(n==-1 && k==-1) break;
getchar();
for(i=0; i<n; i++) {
for(j=0; j<n; j++)
scanf("%c", &maze[i][j]);
getchar();
}
ans = 0;
dfs(0, 0); //从第一行开始
printf("%d\n", ans);
}
return 0;
}
相关文章推荐
- AlertDialog的几种用法
- 使用Alluxio优化Spark RDD
- Stanford CoreNLP 3.6.0 使用入门
- mapreduce-实现多表关联
- OS 学习笔记导航
- 网站备份脚本
- Oracle学习笔记之第八节sql语句(开发课学生指南051)
- Configuring the Avatar
- centos7 yum安装 mysql 5.6
- 数据库安全 Oracle审计Audit
- LeetCOde------3.Longest Substring Without Repeating Characters
- Android 雷达扫描效果、动画SweepGradient
- opencv安装教程
- CCF 201409-2 我100
- 抽象类
- MAC 读写NTFS硬盘
- Oracle学习笔记之第七节手动数据库链介绍
- Spring之AOP(二)
- 序列化与反序列化
- linux中一个简单的TCP套接字程序(2)