题意:给定一个棋盘,如果在某一个点放置棋子,那么这个棋子出现的行和列都不够有其他的棋子,除非他们之间有墙相隔。现在给定一个含有墙的和空地的棋盘,问最多能够放置多少棋子。

解法:将所有为"."的点保存起来,如果两个点不在同一行且不在同一列,那么在两个点之间连一条边,否则判定两点之间是否有墙相隔,有的话连边,否则不连,最后求一个最大团即可。

代码如下:

#include <iostream>
#include <cstdlib>
#include <cstring>
#include <cstdio>
using namespace std;int N, nd[20], idx, G[20][20];
char mp[10][10];bool check(int a, int b) {int x1 = nd[a]/N, y1 = nd[a]%N;int x2 = nd[b]/N, y2 = nd[b]%N;if (x1 != x2 && y1 != y2) return true;if (x1 == x2) { // 如果是在同一行for (int i = y1+1; i < y2; ++i) {if (mp[x1][i] == 'X') {return true;}}}else if (y1 == y2) {for (int i = x1+1; i < x2; ++i) {if (mp[i][y1] == 'X') {return true;}}}return false;
}void build() {memset(G, 0, sizeof (G));for (int i = 0; i < idx; ++i) {for (int j = i+1; j < idx; ++j) {G[i][j] = G[j][i] = check(i, j);}}
}int ret, cnt[20], st[20];void dfs(int x, int num) {for (int i = x+1; i < idx; ++i) {if (!G[x][i]) continue;if (cnt[i] + num <= ret) return;int flag = true;for (int j = 0; j < num; ++j) {if (!G[i][st[j]]) {flag = false;break;}}if (flag) {st[num] = i;dfs(i, num+1);}}if (num > ret) {ret = num;}
}int query() {ret = 0;for (int i = idx-1; i >= 0; --i) {st[0] = i;dfs(i, 1);cnt[i] = ret;}return ret;
}int main() {while (scanf("%d", &N), N) {idx = 0;for (int i = 0; i < N; ++i) {scanf("%s", mp[i]);for (int j = 0; j < N; ++j) {if (mp[i][j] == '.') {nd[idx++] = i*N+j;}}}build();printf("%d\n", query());}return 0;
}

转载于:https://www.cnblogs.com/Lyush/archive/2013/04/02/2996712.html

HDU-1045 Fire NetFire Net 最大团相关推荐

  1. hdu 1045 Fire Net

    经典建模. #include<cstdio> #include<cstring> #include<algorithm> using namespace std; ...

  2. (匹配)Fire Net --hdu --1045

    链接: http://acm.hdu.edu.cn/showproblem.php?pid=1045 http://acm.hust.edu.cn/vjudge/contest/view.action ...

  3. hdu 杭电 1045 Fire Net

    题意:地图中最多能放多少炮台. 解法:深搜. ac代码: View Code #include<iostream> using namespace std;char map[8][8]; ...

  4. 【HDU - 1045】Fire Net (dfs 或二分图)

    题干: Suppose that we have a square city with straight streets. A map of a city is a square board with ...

  5. hdoj 1045 Fire Net 直接枚举 模拟就好了

    题目链接 直接枚举所有结果就可以了, 就是第一次模拟这样的数据 每个位置若没有阻挡物,存在着两种状态,一是有堡垒,二是空地.直接枚举就可以了. 自己的代码写的很繁琐,但是 首次想到了 将if(y> ...

  6. kuangbin带你飞专题合集

    题目列表 [kuangbin带你飞]专题一 简单搜索 [kuangbin带你飞]专题二 搜索进阶 [kuangbin带你飞]专题三 Dancing Links [kuangbin带你飞]专题四 最短路 ...

  7. 算法学习经典例题整理

    陆续会对本篇博客进行更新! 搜索:https://vjudge.net/contest/292597 区间DP:https://vjudge.net/contest/293892 树状背包:https ...

  8. 杭电OJ分类题目(4)-Graph

    原题出处:HDOJ Problem Index by Type,http://acm.hdu.edu.cn/typeclass.php 杭电OJ分类题目(4) HDU Graph Theory - U ...

  9. 杭电OJ分类题目(3)

    原题出处:HDOJ Problem Index by Type,http://acm.hdu.edu.cn/typeclass.php 杭电OJ分类题目(3) HDU Computational Ge ...

  10. C语言求数列最小公倍数,C语言复习---获取最小公倍数(公式法:两个数相乘等于最小公倍数乘以最大公约数)...

    Android 图片浏览器 从原来位置放大至全屏显示 android 图片浏览器 特点: 1.从网络加载图片,只需要传图片地址数组即可 2.点击图片,从原来位置放大至全屏 3.支持手势操作 4.完全自 ...

最新文章

  1. 第十章 Linux下RPM软件的安装与卸载
  2. 3个可以写进简历的京东AI NLP项目实战,走完这五步就是Top算法工程师
  3. C# 设置Word文档保护(加密、解密、权限设置)
  4. Swig在Mac OS X上的安装
  5. JVM中的垃圾收集算法和Heap分区简记
  6. UI标签库专题十:JEECG智能开发平台 Form(form标签)
  7. python苦逼_自学Python编程的第十天(希望有IT大牛看见的指点小弟我,万分感谢)---------来自苦逼的转行人...
  8. uwsgi+django在ubuntu下命令部署亲测ok
  9. LeetCode 209. 长度最小的子数组 (滑动窗口)
  10. php session 不通过cookie_PHP会话控制机制中,Cookie和Session的应用,你更喜欢谁
  11. ubuntu环境下载android源码
  12. 事件驱动架构在 vivo 内容平台的实践
  13. 生物信息学服务器 cpu配置,0[生信技能树]生信服务器配置全攻略
  14. 程序员面试华为,面试官出了这样一个面试题,网友:题目太难了
  15. wps加载失败模板文件损坏_Normal模板异常损坏的修复方法
  16. 基于Springboot+vue的办公OA系统#毕业设计
  17. Y2K Accounting Bug POJ - 2586
  18. (补)单片机原理及应用学习笔记(三)
  19. Blender新手入门练习 宝剑
  20. 入门视频采集与处理(BT656简介)

热门文章

  1. applet mysql_applet数字签名_java applet读取mysql_软件数字签名(5)
  2. MySQL8.0.12 EXPLAIN EXTENDED 报错问题
  3. shell编程cp强制覆盖拷贝时仍需确认问题的处理方法
  4. [Algorithm] Write your own Math.pow function in Javascript, using Recursive approach
  5. Mybatis动态sql及性能优化-3
  6. openvas-tutorial-for-beginners
  7. 再谈代码生成器,xml+xslt,结合扩展,用上设计模式。
  8. 信号的概念以及网络布线
  9. 在微型计算机中1G标准等于,微型计算机的基础知识概要.ppt
  10. 华为 “OSPF” 被动接口配置