zoj 1002 && hdu 1045 Fire Net
2011-08-30 17:42
393 查看
一直都知道这个题目能够用深度优先搜索来做,但是一直没有写过。其实这个题目不是很难,但是好久都没写过搜索了,感觉很吃力了。所以从现在开始想把搜索在好好地搞一下了。题目的大意:给定一个矩阵,这个矩阵中有些地方是空白的,有些地方是有墙的,问最多可以放置多少不互相攻击炮台。
搜索的策略是:从第一个位置开始搜索,搜遍没一个位置,当然有墙和放置了炮台的地方不再可以放置炮台。还有保证不互相攻击...........有些小技巧得好好体会,好好学习了。感觉自己很菜,还得努力啊!
搜索的策略是:从第一个位置开始搜索,搜遍没一个位置,当然有墙和放置了炮台的地方不再可以放置炮台。还有保证不互相攻击...........有些小技巧得好好体会,好好学习了。感觉自己很菜,还得努力啊!
#include<stdio.h> #include<iostream> #include<algorithm> using namespace std; #define N 6 int t; int maxs; char map ; bool judge(int x,int y) { if(map[x][y]!='.')return false; //表示这个点是无法放置炮台的 for(int i=x-1;i>=1;i--) { if(map[i][y]=='X')break; if(map[i][y]=='P')return false; } for(int i=y-1;i>=1;i--) { if(map[x][i]=='X')break; if(map[x][i]=='P')return false; } return true; } void DFS(int pos,int n) { if(pos==t*t) { maxs=maxs>n?maxs:n; return; } int x=pos/t+1; //小技巧,学过来了 int y=pos%t+1; if(judge(x,y)) //判断坐标为(x,y)的点能否放置炮台 { map[x][y]='P'; DFS(pos+1,n+1); map[x][y]='.'; } DFS(pos+1,n); return ; } int main() { while(scanf("%d",&t)!=EOF&&t) { for(int i=1;i<=t;i++) { for(int j=1;j<=t;j++) { cin>>map[i][j]; } } maxs=-1; DFS(0,0); printf("%d\n",maxs); } return 0; }
相关文章推荐
- hdu 1045 && zoj 1002 Fire Net(DFS && 二分图匹配)
- ZOJ 1002 FZU 1098 HDU 1045 Fire Net
- HDU 1045&ZOJ 1002 Fire Net (还是DFS呀...)
- hdu 1045 || zoj 1002 Fire Net(搜索:DFS+水题)
- hdu 1045 Fire Net (与 上一题 zoj 1654 如出一辙)
- 杭电1045(zoj1002)Fire Net
- POJ 3100 & ZOJ 2818 & HDU 2740 Root of the Problem(数学)
- hdu 3714 && zoj 3203 三分
- HDU 1365 & ZOJ 1456 Minimum Transport Cost(记录路径Floyd)
- zoj 3726& hdu 4791 Alice's Print Service
- HDU 1045 Fire Net(DFS)
- HDU 5269 && BestCoder #44 1002 ZYB loves Xor I (分治)
- ZOJ Problem Set - 1045 & ZOJ Problem Set - 1048
- hdu 1045 Fire Net&二分图解法
- HDU 1045 Fire Net (DFS)
- hdu-1045 Fire Net(DFS)
- HDU 1045 Fire Net(DFS)
- TOJ 4373 HDU 4430 ZOJ 3665 Yukari's Birthday / 二分
- zoj 1002 Fire Net
- HDU - 1045 - Fire Net (DFS)