codeforces#566(Div.2)B
B.Plus from Picture
You have a given picture with size w×hw×h. Determine if the given picture has a single "+" shape or not. A "+" shape is described below:
- A "+" shape has one center nonempty cell.
- There should be some (at least one) consecutive non-empty cells in each direction (left, right, up, down) from the center. In other words, there should be a ray in each direction.
- All other cells are empty.
Find out if the given picture has single "+" shape.
The first line contains two integers hh and ww (1≤h1≤h, w≤500w≤500) — the height and width of the picture.
The ii-th of the next hh lines contains string sisi of length ww consisting "." and "*" where "." denotes the empty space and "*" denotes the non-empty space.
If the given picture satisfies all conditions, print "YES". Otherwise, print "NO".
You can output each letter in any case (upper or lower).
5 6
......
..*...
.****.
..*...
..*...
YES
3 5
..*..
****.
.*...
NO
7 7
.......
...*...
..****.
...*...
...*...
.......
.*.....
NO
5 6
..**..
..**..
******
..**..
..**..
NO
3 7
.*...*.
***.***
.*...*.
NO
5 10
..........
..*.......
.*.******.
..*.......
..........
NO
In the first example, the given picture contains one "+".
In the second example, two vertical branches are located in a different column.
In the third example, there is a dot outside of the shape.
In the fourth example, the width of the two vertical branches is 22.
In the fifth example, there are two shapes.
In the sixth example, there is an empty space inside of the shape.
题目大意:就是输入w*h个字符,分别为'*'或'.',规定当形成这样的图形时,则称中间的大五角星为中心点,每次输入时有且仅有一个这样的中心点输出“YES”,否则输出“NO”.

思路:直接暴力搜索,注意剪枝即可,遍历所有输入,当该点为*是,判断其是否为中心点,当中心点数大于1时(不符合题意了),跳出遍历;当该点与中心点的行列都不一致时,也输出“NO”;
要注意这样一种情况,所以要对只有一个中心点的测试数据,进行筛选,看是否有这样的点出现。代码如下:
7 7
.......
...*...
..****.
...*...
...*...
.......
...*...
#include <iostream>
#include <algorithm>
#include <queue>
#include <vector>
#include <string>
#define LL long long
const int max_n=;
using namespace std;
int w,h;
int tx[]={,-,,};
int ty[]={,,,-};
struct node{
int x,y;
}num[];
char mp[max_n][max_n];
bool pan(int a,int b)//判断该点是否越界
{
return a>=&&b>=&&a<w&&b<h;
}
bool bfs(int a,int b)//判断点(a,b)是不是中心点
{
int n=;
for(int i=;i<;i++)
{
int nx=a+tx[i],ny=b+ty[i];
if(mp[nx][ny]=='*'&&pan(nx,ny))n++;
}
if(n==)return true;
else return false;
} int main()
{
int t=,f=;//中心点数,*数
scanf("%d %d",&w,&h);
for(int i=; i<w;i++)
cin>>mp[i];
for(int i=;i<w;i++)
{
bool judge=false,to=false;//判断是否为中心点,to剪枝
for(int j=;j<h;j++)
{
if(mp[i][j]=='*')f++;//计数
if(mp[i][j]=='*'&&t>&&i!=num[].x&&j!=num[].y){//当该点与已知中心点不在统一行列时
to=true;
break;
}
if(mp[i][j]=='*'){
judge=bfs(i,j);
if(judge){num[t].x=i,num[t].y=j;t++;}//是中心点,存下坐标
if(t>){
to=true;
break;
}
}
}
if(to){//剪枝
t=;
break;
}
}
if(t==)//对中心点数为1的数据筛选
{//遍历,因为多减了一次中心点坐标,所以符合题意的f应为-1
int ex=num[].x,ey=num[].y;
for(int i=ex;i<w;i++)
{
if(mp[i][ey]=='*')f--;
else break;
}
for(int i=ex-;i>=;i--)
{
if(mp[i][ey]=='*')f--;
else break;
}
for(int j=ey;j<h;j++)
{
if(mp[ex][j]=='*')f--;
else break;
}
for(int j=ey-;j>=;j--)
{
if(mp[ex][j]=='*')f--;
else break;
} }
if(f>-||t!=)cout<<"NO"<<endl;
else cout<<"YES"<<endl;
return ;
}
codeforces#566(Div.2)B的更多相关文章
- Codeforces Round #566 (Div. 2)
Codeforces Round #566 (Div. 2) A Filling Shapes 给定一个 \(3\times n\) 的网格,问使用 这样的占三个格子图形填充满整个网格的方案数 如果 ...
- Codeforces #344 Div.2
Codeforces #344 Div.2 Interview 题目描述:求两个序列的子序列或操作的和的最大值 solution 签到题 时间复杂度:\(O(n^2)\) Print Check 题目 ...
- Codeforces #345 Div.1
Codeforces #345 Div.1 打CF有助于提高做题的正确率. Watchmen 题目描述:求欧拉距离等于曼哈顿距离的点对个数. solution 签到题,其实就是求有多少对点在同一行或同 ...
- Codeforces Beta Round #27 (Codeforces format, Div. 2)
Codeforces Beta Round #27 (Codeforces format, Div. 2) http://codeforces.com/contest/27 A #include< ...
- Codeforces#441 Div.2 四小题
Codeforces#441 Div.2 四小题 链接 A. Trip For Meal 小熊维尼喜欢吃蜂蜜.他每天要在朋友家享用N次蜂蜜 , 朋友A到B家的距离是 a ,A到C家的距离是b ,B到C ...
- codeforces #592(Div.2)
codeforces #592(Div.2) A Pens and Pencils Tomorrow is a difficult day for Polycarp: he has to attend ...
- codeforces #578(Div.2)
codeforces #578(Div.2) A. Hotelier Amugae has a hotel consisting of 1010 rooms. The rooms are number ...
- codeforces #577(Div.2)
codeforces #577(Div.2) A Important Exam A class of students wrote a multiple-choice test. There are ...
- codeforces #332 div 2 D. Spongebob and Squares
http://codeforces.com/contest/599/problem/D 题意:给出总的方格数x,问有多少种不同尺寸的矩形满足题意,输出方案数和长宽(3,5和5,3算两种) 思路:比赛的 ...
随机推荐
- <人人都懂设计模式>-装饰模式
书上,真的用一个人穿衣打拌来讲解装饰模式的呢. from abc import ABCMeta, abstractmethod class Person(metaclass=ABCMeta): def ...
- mysql binlog空间维护
默认情况下,mysql主从同步的binlog日志,会一直保存. 对于如果已同步好的数据,这显然比较浪费资源. 且如果生产环境磁盘太小,随时还会爆掉,所以很有必要作好binlog的空间维护. 以下操作, ...
- vue - 过滤器-钩子函数路由
一.关于路由 1.使用vue router 本质上是声明一种可以通过路径进行 挂子,用子 找到对应的 template 进行页面渲染 <!DOCTYPE html> <html la ...
- mysql5.7兼容老版本不校验日期等字段
升级mysql5.7时,字段校验出现2个问题,一是不识别日期字段的 0000-00-00 00:00:00,二是有些非空且无默认值的字段,插入时必须指定具体的值. 修改/etc/my.cnf 可在[m ...
- Spring——JDBC——数据库
1.Spring 的数据访问哲学 数据访问的功能放到一个或者多个专注于此项任务的组件.这样的组件通常称为数据访问对象(data access object)DAO或者Repository. 为了避免应 ...
- 2017-2018 ACM-ICPC Southeastern European Regional Programming Contest (SEERC 2017)
2017-2018 ACM-ICPC Southeastern European Regional Programming Contest (SEERC 2017) 全靠 wxh的博客 补完这套.wx ...
- 【java异常】Unexpected error occurred in scheduled task. java.lang.StackOverflowError: null
可能是栈溢出(StackOverFlow) 背景:我用定时器new东西 原因:频率太快了好像!
- 【MyEclipse异常】更换工作空间无法启动的异常
- [KCOJ3393]上马
题目描述 Description Chicken在IEC(International Equestrianism Competition(国际马术表演赛))惨跪,没有成功的上到马,他深刻的记得他的选手 ...
- jQuery的核心对象、原型对象、静态方法、动态方法
什么叫jQuery的核心对象? $ $===jQuery 什么叫jQuery的原型对象? $.fn $.fn===$.prototype 什么叫静态方法? 在构造函树上定义的方法,静态方法通过构造函数 ...