ACM学习感悟——暴力专场B(dfs)
2015-04-19 11:18
288 查看
Problem Description
小晴天非常漂亮的后花园,打算以后退休之后在里面种种花,养养草,所以现在小晴天打算为他的后花园围上栅栏。小晴天的后花园可以看成是一个m*n的矩形,但是其中有一些地方种了树,这些地方都不能安装栅栏,现在小晴天把后花园的平面图告诉你了,请你帮忙设计一个最大的矩形栅栏。
Input
单组数据,第一行包括两个整数m,n(1<=m,n<=500),接下来m行,每行包括n个字符,仅由'x'和'.'组成(ASCII码分别是120与46).其中‘x’表示这个方格有树木,‘.’表示这个点可以建造栅栏
Output
若可以围成一个闭合栅栏,输出一个整数,表示栅栏能打到的最大周长否则输出impossible
Sample Input
4 5 ..... .x.x. ..... ..... 2 2 .x x. 2 5 ..... xxxx.
Sample Output
14 impossible impossible
Hint
样例一可以绕着整个图一圈,周长为2*(4+3)=14样例二与三因为有树木的存在,不能建造一个闭合的栅栏。
本题为单文件读写,样例包括三个文件
这道题深搜还是很明显的,但有一点要注意,不能每一步都递归,否则会爆栈,只需要在碰到镜子转弯的时候递归就行了。
AC代码:
// Created by CQUWEL // Copyright (c) 2015年 CQUWEL. All rights reserved. #include <iostream> #include <cstdio> #include <cstring> #include <cmath> #include <cstdlib> #include <algorithm> #include <cctype> #include <stack> #include <queue> #include <map> #include <string> #include <set> #include <vector> #define INF 0x3f3f3f3f #define cir(i,a,b) for (int i=a;i<=b;i++) #define CIR(j,a,b) for (int j=a;j>=b;j--) #define CLR(x) memset(x,0,sizeof(x)) typedef long long ll; using namespace std; int n,m; int ans,temp; char g[1010][1010]; int vis[1010][1010]; int dir[4][2]={1,0,0,1,-1,0,0,-1}; int mmax(int a, int b) { return a > b ? a : b; } void dfs(int dx,int dy,int px,int py) { for (int i=1;;++i) { int tx=px+i*dx,ty=py+i*dy; if (tx<1 || tx>n || ty < 1 || ty > m || g[tx][ty]=='*') break; if (g[tx][ty]=='E' && !vis[tx][ty]) { temp++; vis[tx][ty]=1; // printf("g[%d][%d]=%c,%d\n",tx,ty,g[tx][ty],temp); continue; } if (g[tx][ty]=='/' && dx==1) { dfs(0,-1,tx,ty);break; } if (g[tx][ty]=='/' && dx==-1) { dfs(0,1,tx,ty);break; } if (g[tx][ty]=='/' && dy==1) { dfs(-1,0,tx,ty);break; } if (g[tx][ty]=='/' && dy==-1) { dfs(1,0,tx,ty);break; } if (g[tx][ty]=='\\' && dx==1) { dfs(0,1,tx,ty);break; } if (g[tx][ty]=='\\' && dx==-1) { dfs(0,-1,tx,ty);break; } if (g[tx][ty]=='\\' && dy==1) { dfs(1,0,tx,ty);break; } if (g[tx][ty]=='\\' && dy==-1) { dfs(-1,0,tx,ty);break; } } ans=mmax(ans,temp); } int main() { // freopen("C:\\Users\\john\\Desktop\\in.txt","r",stdin); cin >> n >> m; ans=0; int sx,sy; for (int i=1;i<=n;i++) { for (int j=1;j<=m;j++) { cin >> g[i][j]; if (g[i][j]=='T') { sx=i;sy=j; } } // getchar(); } for (int i=0;i<4;i++) { CLR(vis); temp=0; dfs(dir[i][0],dir[i][1],sx,sy); } cout << ans << endl; return 0; }
相关文章推荐
- ACM学习感悟——暴力专场F(dp)
- ACM学习感悟——暴力专场E 暴力dp
- ACM学习感悟——ACdream字符串专场F(manacher)
- ACM学习感悟——POF3255 (用SPFA求次短路)
- ACM学习历程—ZOJ 3861 Valid Pattern Lock(dfs)
- ACM学习感悟——摸底赛(并查集)
- ACM学习感悟——HDU-命运
- ACM学习感悟——HDU2844 多重背包
- ACM学习感悟——HDU1204
- ACM学习感悟——POJ1932(图论)
- [ACM] ZOJ 3816 Generalized Palindromic Number (DFS,暴力枚举)
- ACM学习历程—Hihocoder 1288 Font Size(暴力 || 二分)
- ACM学习感悟——POJ2139(Floyd)
- ACM学习感悟——POJ3723(kruskal,并查集)
- ACM学习感悟——Aizu2224 (kruskal 最大生成树)
- ACM学习感悟——HDU1505 最大0矩阵
- ACM学习感悟——POJ3169(差分约束)
- ACM学习感悟——POJ1258(kruskal)
- ACM学习感悟——HDU5092(dp)
- ACM学习历程—NPU 2015年陕西省程序设计竞赛网络预赛(正式赛)A题 小女警的异世界之战(dfs && 分治)