丿聪丶

每发一篇文章,就意味着我向成功更近了一步!

poj 1471 dfs 搜索三角形

题意:在字符是'-'的区域中,找出最大的三角形。

思路:枚举'-'的地方作为三角形的顶,搜索三角形。注意,跟原图对比,判断三角形是正的还是倒的。。。

#include<iostream>
using namespace std;
int sum , len;
char map[220][500];
int dfs(int y,int x) {
	int st = y;
	int ed = y;
	int h = 1 , temp = x;
	int i , j;
	bool flag = 0;
	if ((x+y)%2==0) {
		while(1) {
			for (i = st - 1 ; i <= ed + 1 ; i ++) {
				if (map[temp-1][i]!='-') {//向上搜 
					flag = 1;//如果有不是'-'的  那么就搜索失败了 
					break;	
				}		
			}
			if (flag == 1) break;
			else h++;//如果没失败的话 搜索三角形的下一层  起始位置--  末尾++ 层数-- 
			st --; ed ++; temp --;
		}	
	} else {
		while(1) {
			for (i = st - 1 ; i <= ed + 1 ; i ++) {
				if (map[temp+1][i]!='-') {
					flag = 1;
					break;	
				}		
			}
			if (flag == 1) break;
			else h++;
			st --; ed ++; temp ++;
			//printf("h=%d\n",h);
		}		
	}
	return h;	
} 
int main() {
	int n , i , j;
	int t = 1;
	while (scanf("%d",&n)!=EOF) {
		if (n == 0) break;	
		getchar();
		for (i = 0 ; i < n ; i ++) gets(map[i]);
		int ans = 0 , tmp;
		for (i = 0 ; i < n ; i ++)	
			for (j = i ; j < (2*n-1-i) ; j ++) {
				if (map[i][j]=='-')	{
					tmp = dfs(j , i);//找到可搜的位置  从第i层搜 第j个位置 搜索的时候注意与原图对比 坐标和是偶数向上搜 奇数向下 
					ans = tmp > ans ? tmp : ans;	//找到三角形的层数 S = ans * ans 就OK 
					//printf("%d,%d tmp = %d\n",i,j,tmp);
				}
			}
			printf("Triangle #%d\n",t++);
			printf("The largest triangle area is %d.\n\n",ans*ans);
	}	
}


阅读更多
个人分类: ACM之搜索
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

不良信息举报

poj 1471 dfs 搜索三角形

最多只允许输入30个字

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭