HDU 4414 Finding crosses(dfs)
来源:互联网 发布:av天堂最新域名多少 编辑:程序博客网 时间:2024/05/22 03:04
Problem Description
The Nazca Lines are a series of ancient geoglyphs located in the Nazca Desert in southern Peru. They were designated as a UNESCO World Heritage Site in 1994. The high, arid plateau stretches more than 80 kilometres (50 mi) between the towns of Nazca and Palpa on the Pampas de Jumana about 400 km south of Lima. Although some local geoglyphs resemble Paracas motifs, scholars believe the Nazca Lines were created by the Nazca culture between 400 and 650 AD.[1] The hundreds of individual figures range in complexity from simple lines to stylized hummingbirds, spiders, monkeys, fish, sharks, orcas, llamas, and lizards.
Above is the description of Nazca Lines from Wikipedia. Recently scientists found out that those lines form many crosses. Do those crosses have something to do with the Christian religion? Scientists are curious about this. But at first, they want to figure out how many crosses are there. So they took a huge picture of Nazca area from the satellite, and they need you to write a program to count the crosses in the picture.
To simplify the problem, we assume that the picture is an N*N matrix made up of 'o' and '#', and some '#' can form a cross. Here we call three or more consecutive '#' (horizontal or vertical) as a "segment".
The definition of a cross of width M is like this:
1) It's made up of a horizontal segment of length M and a vertical segment of length M.
2) The horizontal segment and the vertical segment overlap at their centers.
3) A cross must not have any adjacent '#'.
4) A cross's width is definitely odd and at least 3, so the above mentioned "centers" can't be ambiguous.
For example, there is a cross of width 3 in figure 1 and there are no cross in figure 2 ,3 and 4.
You may think you find a cross in the top 3 lines in figure 2.But it's not true because the cross you find has a adjacent '#' in the 4th line, so it can't be called a "cross". There is no cross in figure 3 and figure 4 because of the same reason.
Above is the description of Nazca Lines from Wikipedia. Recently scientists found out that those lines form many crosses. Do those crosses have something to do with the Christian religion? Scientists are curious about this. But at first, they want to figure out how many crosses are there. So they took a huge picture of Nazca area from the satellite, and they need you to write a program to count the crosses in the picture.
To simplify the problem, we assume that the picture is an N*N matrix made up of 'o' and '#', and some '#' can form a cross. Here we call three or more consecutive '#' (horizontal or vertical) as a "segment".
The definition of a cross of width M is like this:
1) It's made up of a horizontal segment of length M and a vertical segment of length M.
2) The horizontal segment and the vertical segment overlap at their centers.
3) A cross must not have any adjacent '#'.
4) A cross's width is definitely odd and at least 3, so the above mentioned "centers" can't be ambiguous.
For example, there is a cross of width 3 in figure 1 and there are no cross in figure 2 ,3 and 4.
You may think you find a cross in the top 3 lines in figure 2.But it's not true because the cross you find has a adjacent '#' in the 4th line, so it can't be called a "cross". There is no cross in figure 3 and figure 4 because of the same reason.
Input
There are several test cases.
In each test case:
The First line is a integer N, meaning that the picture is a N * N matrix ( 3<=N<=50) .
Next N line is the matrix.
The input end with N = 0
In each test case:
The First line is a integer N, meaning that the picture is a N * N matrix ( 3<=N<=50) .
Next N line is the matrix.
The input end with N = 0
Output
For each test case, output the number of crosses you find in a line.
Sample Input
4oo#o o###oo#oooo#4oo#o o###oo#ooo#o5oo#oooo#oo #####oo#oooo##o6ooo#ooooo##o o#####ooo#ooooo#oooooooo0
Sample Output
1000
Source
2012 ACM/ICPC Asia Regional Hangzhou Online
题意:找出十字架个数
思路:列举十字架的中点,dfs时传进去方向,方便判断十字架周围是不是有#(这是不合格的)
#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>#include<cmath>#include<queue>#include<vector>#define L(x) (x<<1)#define R(x) (x<<1|1)#define MID(x,y) ((x+y)>>1)using namespace std;#define N 55int ans,le,ri,up,down,temp;int n,flag;int step[4][2]={-1,0,1,0,0,-1,0,1};//上,下,左,右char a[N][N];int judge(int x,int y){if(x>=0&&x<n&&y>=0&&y<n)return 1;return 0;}void dfs(int x,int y,int i){temp++;int j;if(i<2) j=2;elsej=0;int xx=x+step[i][0];int yy=y+step[i][1];if(!judge(xx,yy)) return ;if(a[xx][yy]=='o') return ;int xup=xx+step[j][0];int ydn=yy+step[j][1];if(judge(xup,ydn)&&a[xup][ydn]=='#'){ flag=1; return ;} xup=xx+step[j+1][0]; ydn=yy+step[j+1][1];if(judge(xup,ydn)&&a[xup][ydn]=='#'){flag=1; return ;}dfs(xx,yy,i);}int main(){int i,j;while(scanf("%d",&n),n){for(i=0;i<n;i++)scanf("%s",a[i]);ans=0;for(i=0;i<n;i++)for(j=0;j<n;j++)if(a[i][j]=='#'){temp=0;flag=0;dfs(i,j,0);up=temp;temp=0; if(flag) continue;dfs(i,j,1);down=temp;temp=0; if(flag) continue;dfs(i,j,2);le=temp;temp=0; if(flag) continue;dfs(i,j,3);ri=temp;temp=0;if(flag) continue;if(le==ri&&down==up&&le!=1&&up!=1) //左右相等,上下相等,不能是一条线ans++;}printf("%d\n",ans);}return 0;}
0 0
- HDU 4414 Finding crosses(dfs)
- Finding crosses hdu 4414 dfs
- HDU 4414 Finding crosses (DFS + BFS)
- hdu-4414-Finding crosses
- hdu 4414 Finding crosses
- hdu 4414 Finding crosses
- HDU 4414 Finding crosses
- HDU 4414 Finding crosses
- HDU 4414 Finding crosses
- HDU 4414: Finding crosses
- HDU 4414 Finding crosses(暴力判断)
- hdu 4414 Finding crosses(搜索)
- HDU 4414 Finding crosses(搜索)
- HDU 4414 Finding crosses(爆搜)
- hdu 4414Finding crosses(模拟)
- HDU4414 Finding crosses(模拟 || DFS)
- HDU 4414 Finding crosses 暴力枚举
- hdu 4414 Finding crosses 简单搜索
- 基础排序算法总结
- EXTJS和javaweb应用的开发思路
- ubuntu12.04安装opensips
- 赵雅智_Swift(3)_swift注释
- 从资源池和管理的角度理解物理内存
- HDU 4414 Finding crosses(dfs)
- 与智者同行,你会不同凡响
- Linux下C编程的学习_1
- 微软面试题1
- Uncaught ReferenceError: 添加广告位权限 is not defined
- Solitaire(单向BFS||双向BFS)
- 各大浏览器 CSS3 和 HTML5 兼容速查表
- 怎么学unity3d-unity3d学习路线建议
- 【LeetCode】Max Points on a Line