HDU-1045-fire net
2012-08-31 09:56
246 查看
题目传送门:http://acm.hdu.edu.cn/showproblem.php?pid=1045
程序分析:
题目是说在一个特殊的地图里摆设碉堡,限制条件可能跟N皇后又点相似,但是这里有墙,中间隔有墙的话还是不会互相干扰的。只是行列方向会冲突,斜角线不会冲突,。所以我们只有判断所在的行列不会存在冲突的碉堡就行。注意中间可以隔有墙。记住每一次到达最后一个点时的可放碉堡数,比现在保存最大的就替换为最大值。
解决方法:
深搜回溯,找出每一种方法的最大放置碉堡数,编写一个判断能否放置碉堡的函数,细节看代码。
View Code
程序分析:
题目是说在一个特殊的地图里摆设碉堡,限制条件可能跟N皇后又点相似,但是这里有墙,中间隔有墙的话还是不会互相干扰的。只是行列方向会冲突,斜角线不会冲突,。所以我们只有判断所在的行列不会存在冲突的碉堡就行。注意中间可以隔有墙。记住每一次到达最后一个点时的可放碉堡数,比现在保存最大的就替换为最大值。
解决方法:
深搜回溯,找出每一种方法的最大放置碉堡数,编写一个判断能否放置碉堡的函数,细节看代码。
View Code
#include<iostream> #include<string> using namespace std; int n, m; char map[5][5]; int Max; int pd(int x, int y) { for(int i=x-1; i>=0; i--) //判断此行能否放置碉堡 { if(map[i][y] == '0') return 0; if(map[i][y] == 'X') break; } for(int j=y-1; j>=0; j--) //判断此行能否放置碉堡 { if(map[x][j] == '0') return 0; if(map[x][j] == 'X') break; } return 1; } void DFS(int k, int curmax) { int x, y; if(k == n*n) //到达最后一个点 { if(Max < curmax) //保存这一种方法最多能摆的碉堡数 { Max = curmax; return ; } } else { x = k/n; y = k%n; if(map[x][y]=='.' && pd(x, y)==1) //可以摆放就把个数加一继续找下一个可以摆的地方 { map[x][y] = '0'; DFS(k+1, curmax+1); map[x][y] = '.'; } DFS(k+1, curmax); //不能摆或者回溯回来进行下一个地方的查找 } } int main() { while(cin>>n && n) { for(int i=0; i<n; i++) { scanf("%s", map[i]); } Max = 0; DFS(0, 0); cout<<Max<<endl; } return 0; }
相关文章推荐
- hdu1045 Fire Net(dfs)
- HDU 1045 Fire Net
- HDU 1045-Fire Net(DFS)
- HDU1045 Fire Net(深搜DFS)
- hdu 1045 Fire Net(dfs)
- hdu 1045 Fire Net (dfs)
- HDU 1045 Fire Net(贪心+函数参数)
- hdu-1045 Fire Net(DFS)
- 【DFS 回溯】HDU 1045 Fire Net
- HDU 1045 Fire Net 最大二分图匹配
- hdu 1045 && zoj 1002 Fire Net(DFS && 二分图匹配)
- HDU 1045(Fire Net)题解
- HDU 1045 Fire Net(搜索/贪心/二分图最大匹配)
- hdu 1045 Fire Net(dfs)
- hdu 1045 Fire Net(贪心)
- HDU1045 - Fire Net (深搜)
- hdu 1045 Fire Net (DFS java)
- hdu 1045 Fire Net(二分匹配 or 暴搜)
- HDU-1045-Fire Net
- HDU 1045 Fire Net (DFS)