UVA 639
来源:互联网 发布:手机应用隐藏软件 编辑:程序博客网 时间:2024/06/16 17:35
题目大意:棋盘上放棋子,要求这颗棋子的上下左右不能有其他棋子,两枚棋子之间有墙隔开,则可以。给定棋盘,问最多可以放几枚棋子。
解题思路:生成子集的构造法,将所有情况枚举,然后判断是否成立,最大4*4的棋盘。2^16可以的。
ac代码:
#include <iostream>#include <cstring>#include <algorithm>using namespace std;int n, re, a[20], x[10], y[10], flag;char puz[10][10];void jud(int x, int a, int b, int c){flag = 0;if (c){for (int k=b+1; k<a; k++)if (puz[k][x] == 'X')flag = 1;}elsefor (int k=b+1; k<a; k++)if (puz[x][k] == 'X')flag = 1;}int check(int cur){for (int i=0; i<cur; i++){x[i] = a[i] / n, y[i] = a[i] % n;if (puz[ x[i] ][ y[i] ] == 'X')return 0;}for (int i=0; i<cur; i++)for (int j=i+1; j<cur; j++)if (x[i] == x[j]){if (y[i] > y[j])jud(x[i], y[i], y[j], 0);elsejud(x[i], y[j], y[i], 0);if (!flag)return 0;}else if (y[i] == y[j]){if (x[i] > x[j])jud(y[i], x[i], x[j], 1);elsejud(y[i], x[j], x[i], 1);if (!flag)return 0;}return cur;}void dfs(int cur){int minu=0;if (cur > re)re = max(re, check(cur));if (cur)minu = a[cur-1] + 1;for (int i=minu; i<n*n; i++){a[cur] = i;dfs(cur+1);}}int main(){while (scanf("%d", &n)!=EOF && n){for (int i=0; i<n; i++)scanf("%s", puz[i]);re = 0;dfs(0);printf("%d\n", re); }return 0; }
阅读全文
0 0
- uva 639
- uva 639
- UVA 639
- uva 639
- uva 639
- uva 639
- UVA 639
- UVA 639 (13.08.25)
- uva 639(回溯)
- uva--639+dfs+回溯
- uva
- UVA
- UVA
- UVA
- uva
- UVA
- UVA
- UVA
- 解决国内NPM安装依赖速度慢问题
- spring学习笔记八 bean生命周期
- java 文件下载
- Git学习——如何进入到某个本地git库
- 原生JS实现AJAX、JSONP及DOM加载完成事件,并提供对应方法
- UVA 639
- SpringAOP 详解
- 项目升级-加密的参数传递到后台然后解密(相当于重新封装下request)
- 个人微信扫码群发,微信扫描二维码群发系统开发
- Linux 系统编程基础
- IOC 和 AOP
- Ubuntu下jmap,jinfo Can't attach to the process
- LintCode 2.尾部的零
- javascript类型