
HDU 1045 Fire Net
发布日期:2021-05-07 12:48:17
浏览次数:20
分类:原创文章
本文共 1487 字,大约阅读时间需要 4 分钟。
题目传送门:
题意:在一个n*n(n<=4)的区域内建造炮塔,炮塔与炮塔不能在同一行和同一列除非中间有城墙阻隔,要你求出最多能建造多少个炮塔。
思路:因为n最大只有4,可以利用dfs全面检索。
#include <iostream>#include <cstring>using namespace std;int n,maxx;char a[10][10];int b[10][10]; //空地为0,城墙为1,炮塔为2。int judge(int x,int y) //判断能否造塔。{ int z; if(b[x][y]!=0) return 0; //判断当前位置是否为空地。 //下面四个循环分别向四个方向(上下左右)检索是否会遇到炮塔。 for(z=x-1;z>=1;z--) //上 { if(b[z][y]==1) break; //如果遇到墙则执行下一个方向的判断,如果遇到炮塔则直接结束返回0。 else if(b[z][y]==2) return 0; } for(z=x+1;z<=n;z++) //下 { if(b[z][y]==1) break; else if(b[z][y]==2) return 0; } for(z=y-1;z>=1;z--) //左 { if(b[x][z]==1) break; else if(b[x][z]==2) return 0; } for(z=y+1;z<=n;z++) //右 { if(b[x][z]==1) break; else if(b[x][z]==2) return 0; } return 1;}//利用dfs深度检索,a表示当前可造的塔数。int dfs(int a){ for(int i=1;i<=n;i++) { for(int j=1;j<=n;j++) { if(judge(i,j)) { b[i][j]=2; dfs(a+1); b[i][j]=0; } } } if(a>maxx) { maxx=a; } return maxx;}int main(){ while(cin>>n) { if(n==0) break; memset(b,0,sizeof(b)); int i,j; for(i=1;i<=n;i++) { for(j=1;j<=n;j++) { cin>>a[i][j]; if(a[i][j]=='X') b[i][j]=1; } } maxx=0; cout<<dfs(0)<<endl; }}
发表评论
最新留言
做的很好,不错不错
[***.243.131.199]2025年04月11日 17时28分26秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
解决ubuntu在虚拟机(VMware)环境下不能联网的问题
2019-03-04
LeetCode - 字符串相乘
2019-03-04
maya里创建不同颜色大小的HeadsUpDisplay的效果
2019-03-04
python 导航栏
2019-03-04
Python根据程序名称结束进程
2019-03-04
C# 适配器模式
2019-03-04
二分查找与插入排序的结合使用
2019-03-04
71 简化路径(模拟、栈)
2019-03-04
892 三维形体的表面积(分析)
2019-03-04
40. 组合总和 II(dfs、set去重)
2019-03-04
16 最接近的三数之和(排序、双指针)
2019-03-04
1333 餐厅过滤器(treemap映射)
2019-03-04
python中的all函数
2019-03-04
1137 第 N 个泰波那契数(迭代、记忆性递归)
2019-03-04
279 完全平方数(dfs)
2019-03-04
279 完全平方数(bfs)
2019-03-04
865 具有所有最深结点的最小子树(递归)
2019-03-04
738 单调递增的数字(找出逆序的位置)
2019-03-04
410 分割数组的最大值(二分查找、动态规划)
2019-03-04
875 爱吃香蕉的珂珂(二分查找)
2019-03-04