HDU 1045 Fire Net【深搜】
来源:互联网 发布:蓝牙听歌软件 编辑:程序博客网 时间:2024/05/29 19:38
题目链接
题目意思
给你一个n*n的矩阵,让你在空地放枪支,其中要求“.”代表空地,“X”代表墙。要求枪支不能出现在同一行,同一列,除非中间有墙阻隔。现在问你最多能放多少枪支。
解题思路
这道题就是一个普通的深搜问题,和之前做过的N皇后问题很相似。我们要从开始往后走,走到一个位置的时候往这一行,这一列的前边搜索是否有枪,如果有枪就不能再放,如果遇到墙就可以放置。
代码部分
#include <iostream>#include <stdio.h>#include <string.h>#include <algorithm>#include <queue>using namespace std;char map[9][9];int n,ans;bool judge(int x,int y){ bool flag=true; for(int i=x; i>=0; i--) { if(map[i][y]=='#') flag=false; else { if(map[i][y]=='X') break; else continue; } } for(int i=y; i>=0; i--) { if(map[x][i]=='#') flag=false; else { if(map[x][i]=='X') break; else continue; } } return flag;}void dfs(int idx,int t)///idx表示当前位置,t表示放枪的数量{ ans=max(t,ans); if(idx>n*n) return; int x=idx/n;///当前位置的横坐标 int y=idx%n;///当前位置的纵坐标 int temp,tmp;///temp表示下一个位置,tmp表示枪支数目 if(map[x][y]=='.'&&judge(x,y))///如果是空地并且能够放枪 { map[x][y]='#';///将放枪的地方标记 temp=idx+1; tmp=t+1; dfs(temp,tmp); map[x][y]='.'; temp=idx+1; tmp=t; dfs(temp,tmp); } else { temp=idx+1; tmp=t; dfs(temp,tmp); }}int main(){ while(~scanf("%d",&n),n) { ans=-1; for(int i=0; i<n; i++) { for(int j=0; j<n; j++) { scanf(" %c",&map[i][j]); } } dfs(0,0); cout<<ans<<endl; }}
阅读全文
1 0
- HDU 1045 Fire Net【深搜】
- hdu 1045 Fire Net
- HDU 1045 Fire Net
- HDU 1045 Fire Net
- Hdu 1045 Fire Net
- HDU 1045 Fire Net
- hdu 1045 Fire Net
- HDU-1045-Fire Net
- hdu 1045 Fire Net
- hdu 1045 Fire Net
- HDU 1045 Fire Net
- hdu 1045 Fire Net
- HDU-1045 Fire Net
- HDU:1045 Fire Net
- HDU 1045 Fire Net
- HDU 1045 Fire Net
- hdu 1045 Fire Net
- hdu 1045 Fire Net
- Linux下的lds链接脚本简介(四)
- 安卓使用Gson转化为Json数据出现中文乱码的解决方式
- event事件相关和window对象json字符串对象之间转换
- 1.1.Qt程序发布注意事项
- pycharm快捷键、常用设置、配置管理
- HDU 1045 Fire Net【深搜】
- redis in action.pdf(英文原版) 免费下载
- 51nod 1256 乘法逆元
- C++ 基础知识七
- 卷积神经网络结构详解
- 1_python环境搭建以及开发工具安装
- hdu5984 Pocky(猜数学期望公式)
- java集合总结(二)-各类关系与注意事项
- Coursera 机器学习(by Andrew Ng)课程学习笔记(四)——神经网络(一)