题目大意:

  输入一个矩阵,再输入其中一个“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 广搜的更多相关文章

  1. HDU--杭电--1195--Open the Lock--深搜--都用双向广搜,弱爆了,看题了没?语文没过关吧?暴力深搜难道我会害羞?

    这个题我看了,都是推荐的神马双向广搜,难道这个深搜你们都木有发现?还是特意留个机会给我装逼? Open the Lock Time Limit: 2000/1000 MS (Java/Others)  ...

  2. HDU 5652(二分+广搜)

    题目链接:http://acm.hust.edu.cn/vjudge/contest/128683#problem/E 题目大意:给定一只含有0和1的地图,0代表可以走的格子,1代表不能走的格 子.之 ...

  3. nyoj 613 免费馅饼 广搜

    免费馅饼 时间限制:1000 ms  |  内存限制:65535 KB 难度:3   描述 都说天上不会掉馅饼,但有一天gameboy正走在回家的小径上,忽然天上掉下大把大把的馅饼.说来gameboy ...

  4. poj 3984:迷宫问题(广搜,入门题)

    迷宫问题 Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 7635   Accepted: 4474 Description ...

  5. poj 3278:Catch That Cow(简单一维广搜)

    Catch That Cow Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 45648   Accepted: 14310 ...

  6. 双向广搜 POJ 3126 Prime Path

      POJ 3126  Prime Path Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 16204   Accepted ...

  7. 广搜+打表 POJ 1426 Find The Multiple

    POJ 1426   Find The Multiple Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 25734   Ac ...

  8. 双向广搜 codevs 3060 抓住那头奶牛

    codevs 3060 抓住那头奶牛 USACO  时间限制: 1 s  空间限制: 16000 KB  题目等级 : 黄金 Gold   题目描述 Description 农夫约翰被告知一头逃跑奶牛 ...

  9. 双向广搜+hash+康托展开 codevs 1225 八数码难题

    codevs 1225 八数码难题  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 钻石 Diamond   题目描述 Description Yours和zero在研究A*启 ...

随机推荐

  1. json简介及josn数组中取字符

    1.json字符串就是字符串,只不过格式是Json格式的,以键值对的形式存在,键和值可以是字符串,数字,空值,数组等. json对象在花括号中书写,一个json对象包含多个键值对,json对象以花括号 ...

  2. matlab读取mysql数据

    conn = database('ci_bootstrap_3','root','1q1q1q1q','com.mysql.jdbc.Driver','jdbc:mysql://localhost:3 ...

  3. 实验吧writeup

    后台登录 1.看源码有这样一段php代码<!-- $password=$_POST['password']; $sql = "SELECT * FROM admin WHERE use ...

  4. [Ynoi2015]盼君勿忘

    题目大意: 给定一个序列,每次查询一个区间\([l,r]\)中所有子序列分别去重后的和\(\bmod p\)(每次询问模数不同). 解题思路: 在太阳西斜的这个世界里,置身天上之森.等这场战争结束之后 ...

  5. [luogu4478 BJWC2018] 上学路线 (容斥原理+拓展lucas)

    传送门 Description 小B 所在的城市的道路构成了一个方形网格,它的西南角为(0,0),东北角为(N,M). 小B 家住在西南角,学校在东北角.现在有T 个路口进行施工,小B 不能通过这些路 ...

  6. Vue CLI 3.x 简单体验

    文档 中文文档 补充于02月10日 vue脚手架的3.x版本已经在开发中,现在还处于alpha版本.我们来看看有哪些变化. 使用 npm install -g @vue/cli 命名方式已经改为npm ...

  7. oculus network error ovr53225466

    最近调试oculus,搬运代码到win10平台,发现最近FB对oculus的服务程序进行了更新,必须要登陆账号才能进行调试. 于是安装oculusclient,但是登陆的过程中出现了问题,如果不用代理 ...

  8. [下载]Oracle LOB字段编辑工具

    OraLobEditor 是Oracle LOB (CLOB, BLOB) 字段编辑工具. 查看.编辑LOB (CLOB, BLOB)字段(plain text, RTF, image, hex, h ...

  9. 百度之星2014初赛 - 1002 - Grids

    先上题目: Grids Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65535/65535 K (Java/Others)Tota ...

  10. js简单自定义事件与主动触发事件

    var events = { addHandler: function (element, eventType, handler) { if (element.addEventListener) { ...