zoj 1002 dfs()
来源:互联网 发布:js修改标签属性值 编辑:程序博客网 时间:2024/06/06 03:23
题意:
就是会给你一些点架设炮台,一架炮台的一行,一列不能再架设炮台,但是有墙除外;
思路:
一,这道题和N皇后差不多,但是不同的是会有一些墙,这些墙变成了问题,为什么呢?
1,他会终止搜索,所以当你发现你的到结果少了,很可能是搜索被中断了
二,那些地方我们能架设炮台那?
1,我们需要从该点出发去判断,判断他的行和列是否有炮台,如果没有则可以放,但是如果遇到强,则该方向不在差,然后枚举给地图的每一点,判断能不能放,
相信以上两点,代码就清楚了
#include<stdio.h>#include<string.h>#include<iostream>using namespace std;int n,m;int map[8][8],vis[8][9];bool cmd(int x,int y) // 判断该点是否可以放{ if(x<1||x>n||y<1||y>n)return false; for(int i = y;i>=1;i--) { if(vis[x][i]==1) return false; if(map[x][i]==-1) break; } for(int i=y;i<=n;i++) { if(vis[x][i]==1) return false; if(map[x][i]==-1) break; } for(int i=x;i<=n;i++) { if(vis[i][y]==1) return false; if(map[i][y]==-1) break; } for(int i=x;i>=1;i--) { if(vis[i][y]==1) return false; if(map[i][y]==-1) break; } return true;}int Max;void dfs(int count){ if(count>Max) Max = count; for(int i=1;i<=n;i++) { for(int j=1;j<=n;j++) // 该方法可能会有点慢,原因是每次都要遍历全图,但是思路清晰(并且这道题地图小) if(cmd(i,j)&&map[i][j]!=-1) { vis[i][j] = 1; dfs(count+1); vis[i][j] = 0 ; } }}int main(){ while(cin>>n,n) { getchar(); Max = -100000; memset(map,0,sizeof(map)); memset(vis,0,sizeof(vis)); for(int i=1;i<=n;i++) { for(int j=1;j<=n;j++) { char c = getchar(); switch(c) { case 'X' : map[i][j] = -1;break; case '.': map[i][j] = 0;break; } } getchar(); } dfs(0); printf("%d\n",Max); }}
- zoj 1002 dfs
- zoj 1002 DFS
- zoj 1002 dfs()
- zoj 1002 Fire Net dfs
- zoj 1002 Fire Net【DFS】
- zoj 1002 Fire Net【DFS】
- ZOJ 1002 Fire Net【dfs】
- ZOJ 1002 fire net DFS
- ZOJ 1002 firenet ( DFS)
- zoj 1002 dfs / 最大匹配 碉堡
- zoj 1002 Fire Net (简单dfs)
- ZOJ 1002 Fire Net(DFS啊 )
- ZOJ 1002 Fire Net(基础dfs)
- ZOJ Problem Set - 1002(DFS)
- zoj 1457 dfs水题
- zoj 2100 dfs
- zoj 1711 dfs
- zoj 1204 dfs
- 快速排序算法
- 从零开始学C++之异常(二):程序错误、异常(语法、抛出、捕获、传播)、栈展开
- UVa 138 - Street Numbers
- delete this
- eclipse中设置字体大小
- zoj 1002 dfs()
- Paper Read Records
- Linux/Unix shell 脚本清除归档日志文件
- 打印调试信息
- Python学习笔记(三):数字
- 自动化测试调查问卷送《QTP自动化测试最佳实践》
- 挣钱为什么?
- GDB中应该知道的几个调试方法
- rand生成伪随机数