uva 639
2015-08-09 21:00
337 查看
递归回溯,枚举图中的所有位置,判断当前点能否放车,如果放置,vis标记为1;(这里和八皇后问题不同,即使在同行或者同列,有墙间隔,依然可以放置小车)
判断能否放置的方法参考代码中的judge函数;
判断能否放置的方法参考代码中的judge函数;
#include <cstdio> #include <cstring> using namespace std; #define minn -0x3f3f3f3f int n, _min; int vis[5][5]; char g[5][5]; void init(){ memset(vis, 0, sizeof(vis)); _min = minn; } bool judge(int x, int y){ for(int i = x-1; i >= 0; --i){ //judge row: if(g[i][y] == 'X') break; if(vis[i][y]) return true; } for(int i = y-1; i >= 0; --i){ //judge column if(g[x][i] == 'X') break; if(vis[x][i]) return true; } for(int i = y+1; i < n; ++i){ if(g[x][i] == 'X') break; if(vis[x][i]) return true; } return false; } void dfs(int x, int y, int cnt){ for(int i = x; i < n; ++i){ for(int j = 0; j < n; ++j){ if(!vis[i][j] && g[i][j] == '.' && !judge(i, j)){ //判断能否放 rook; vis[i][j] = 1; dfs(i, j, cnt+1); vis[i][j] = 0; //回溯问题中,如果是全局变量大多要还原状态量(强调); } } } if(cnt > _min){ _min = cnt; } } int main() { while(scanf("%d", &n) != EOF && n){ for(int i = 0; i < n; ++i){ scanf("%s", g[i]); } init(); dfs(0, 0, 0); printf("%d\n", _min); } return 0; }
相关文章推荐
- 常用的一些加密算法
- Android-ListView优化常见的三种方式
- 源码管理工具的使用
- Linux文件系统
- OC学习 -- Extension
- HDU 2073 无限的路
- 【MySql】使用记录<二>
- Mac下安装npm,http-server,安装虚拟服务器
- SPRING依赖注入
- OC学习 -- NSDate和NSDateFormatter
- iOS学习:调用相机,选择图片上传,带预览功能
- 机房收费系统重构——Datatable转泛型
- Java学习--(七)类
- 546B. Soldier and Badges
- OC学习 - Protocol delegate
- Leetcode N-Queens系列
- 普通型母函数模板理解
- UVA
- 浅谈系统安装原理以及在Windows上安装Linux的细节
- 建造者设计模式