poj1111 Image Perimeters 广搜
题目大意:
输入一个矩阵,再输入其中一个“X”的位置(从1开始)。从该位置向八个方向扩展,如果是“X”就可以并在一起。问最后得到的模块的周长是多少。
解题思路:
按照广搜的思路来做。用一个二维的数组标记每一个点,-1代表着该点不能被搜索了(可能原本就是“.”,也可以该点已经出队列了);0代表着该点还没被搜到;1代表着该点已经被搜到,但是还在队列中。
初始周长为4,代表只有一个X时的周长。对于每一个点,如果是“X”,就初始化为标记为0;如果是"."就初始化为-1。
对于当前进行搜索的X的上下左右四个方向上的X,如果被搜到过(就是说那个点在队列中),就把当前的周长减2;如果上下左右的X没有被搜到过,周长加2,并且把那个点入队,并且标记为1。原因:两个在横向和纵向上相邻的X,它们之间和在一起的周长是4+4-2=4+2,相当于是一个X的周长+2。对于被搜到过的X,由于它又与其它的X相邻,所以周长需要减2。
对于当前进行搜索的X的东南、西南、东北、西北四个方向的X,如果没有被搜到过,周长加4。
最后输出周长就可以了。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
using namespace std; const int N=;
int dx[]={,,,-,,,-,-};
int dy[]={,-,,,,-,,-}; int vis[N][N];
int r,c,s,sx,sy;
struct node
{
int x,y;
};
node a,b;
bool isin(int x,int y)
{
return x>=&&x<r&&y>=&&y<c;
}
queue<node> q;
void BFS()
{
while(!q.empty())
{
a=q.front(); q.pop();
vis[a.x][a.y]=-;
int i;
for(i=;i<;i++)
{
int x=a.x+dx[i],y=a.y+dy[i];
if(isin(x,y)&&vis[x][y]==)
{
s-=;
vis[x][y]=;
}
if(isin(x,y)&&!vis[x][y])
{
s+=;
b.x=x; b.y=y;
q.push(b);
vis[x][y]=;
}
}
for(i=;i<;i++)
{
int x=a.x+dx[i],y=a.y+dy[i];
if(isin(x,y)&&!vis[x][y])
{
s+=;
b.x=x; b.y=y;
q.push(b);
vis[x][y]=;
}
}
}
printf("%d\n",s);
}
int main()
{
//freopen("test.txt","r",stdin);
char ch;
while(scanf("%d%d%d%d",&r,&c,&sx,&sy)!=EOF&&r)
{
for(int i=;i<r;i++){
getchar();
for(int j=;j<c;j++){
scanf("%c",&ch);
if(ch=='X') vis[i][j]=;
else vis[i][j]=-;
}
}
a.x=sx-; a.y=sy-; s=;
while(!q.empty()) q.pop();
q.push(a);
BFS();
}
return ;
}
//还是再从搜索开始吧。
poj1111 Image Perimeters 广搜的更多相关文章
- HDU--杭电--1195--Open the Lock--深搜--都用双向广搜,弱爆了,看题了没?语文没过关吧?暴力深搜难道我会害羞?
这个题我看了,都是推荐的神马双向广搜,难道这个深搜你们都木有发现?还是特意留个机会给我装逼? Open the Lock Time Limit: 2000/1000 MS (Java/Others) ...
- HDU 5652(二分+广搜)
题目链接:http://acm.hust.edu.cn/vjudge/contest/128683#problem/E 题目大意:给定一只含有0和1的地图,0代表可以走的格子,1代表不能走的格 子.之 ...
- nyoj 613 免费馅饼 广搜
免费馅饼 时间限制:1000 ms | 内存限制:65535 KB 难度:3 描述 都说天上不会掉馅饼,但有一天gameboy正走在回家的小径上,忽然天上掉下大把大把的馅饼.说来gameboy ...
- poj 3984:迷宫问题(广搜,入门题)
迷宫问题 Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 7635 Accepted: 4474 Description ...
- poj 3278:Catch That Cow(简单一维广搜)
Catch That Cow Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 45648 Accepted: 14310 ...
- 双向广搜 POJ 3126 Prime Path
POJ 3126 Prime Path Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 16204 Accepted ...
- 广搜+打表 POJ 1426 Find The Multiple
POJ 1426 Find The Multiple Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 25734 Ac ...
- 双向广搜 codevs 3060 抓住那头奶牛
codevs 3060 抓住那头奶牛 USACO 时间限制: 1 s 空间限制: 16000 KB 题目等级 : 黄金 Gold 题目描述 Description 农夫约翰被告知一头逃跑奶牛 ...
- 双向广搜+hash+康托展开 codevs 1225 八数码难题
codevs 1225 八数码难题 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description Yours和zero在研究A*启 ...
随机推荐
- Js正则匹配处理时间
<html> <body> <script type="text/javascript"> //将long 型 转换为 日期格式 年-月-日 h ...
- javascrip this指向问题深入理解
在JavaScript中this变量是一个令人难以摸清的关键字,this可谓是非常强大,充分了解this的相关知识有助于我们在编写面向对象的JavaScript程序时能够游刃有余. 1. 一般用处 对 ...
- scrapy获取重定向之前的url
通过 response.request.meta['redirect_urls'] 来获取跳转之前的链接
- Git server出现cache大回收分析
实例 git server是一个io密集型的服务,当cache量很大的时候,cache会全部一次释放,导致那么一瞬间,IO read压力很大,因为,用户的大量请求,需要重新从磁盘读到内存,但是这个时刻 ...
- CentOS 7.2.1511编译安装Nginx1.10.1+MySQL5.7.15+PHP7.0.11
准备篇 一.防火墙配置 CentOS 7.2默认使用的是firewall作为防火墙,这里改为iptables防火墙. 1.关闭firewall: systemctl stop firewalld.se ...
- linux根据进程名字杀死进程
ps -ef | grep procedure_name | grep -v grep | awk '{print $2}' | xargs kill -9 Linux Shell脚本实现根据进程名杀 ...
- jetty+httpClient使用
背景: 看了https://www.cnblogs.com/donlianli/p/10954716.html这篇文章之后,突然发现自己的知识面太窄了,连这些几乎可以说基础的工具都没怎么用过,于是决定 ...
- Atomic operations on the x86 processors
On the Intel type of x86 processors including AMD, increasingly there are more CPU cores or processo ...
- Hive教程(1)
1. 介绍 Apache Hive可以使用SQL来读,写,管理分布式存储的大数据集,结构可以投射到已经存储的数据上,命令行工具和JDBC驱动可以让用户连接到Hive. 2. 安装和配置 你可以下载Hi ...
- AIX下sort命令简介及使用
AIX下sort命令简介及使用 sort -rn +3 , r倒排序,n按照数字排序: +3按照第四列排序: 第一列是+0: 学习:http://blog.csdn.net/chen_linbo/a ...