poj 1111bfs
来源:互联网 发布:网络协议基础知识 编辑:程序博客网 时间:2024/05/29 03:33
http://poj.org/problem?id=1111
题目大意:
输入一个矩阵,再输入其中一个“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 <queue>#include <cstring>using namespace std;int vis[21][21];int n,m,r,c;char maze[21][21];int dir[8][2]={0,1,0,-1,1,0,-1,0,1,1,1,-1,-1,1,-1,-1};bool Judge(int x,int y){ if(x>=0&&x<n&&y>=0&&y<m&&maze[x][y]=='X'&&vis[x][y]!=-1) return true; return false;}struct Node{ int x,y;};void bfs(){ queue<Node> q; Node s,next; s.x=r-1;s.y=c-1; q.push(s); int cnt=4; vis[r-1][c-1]=1; while(!q.empty()) { s=q.front(); q.pop(); vis[s.x][s.y]=-1; for(int i=0;i<8;i++) { if(Judge(s.x+dir[i][0],s.y+dir[i][1])) { if(vis[s.x+dir[i][0]][s.y+dir[i][1]]==0) { next.x=s.x+dir[i][0]; next.y=s.y+dir[i][1]; vis[next.x][next.y]=1; q.push(next); if(i<4) cnt+=2; else cnt+=4; } else if(vis[s.x+dir[i][0]][s.y+dir[i][1]]==1) { if(i<4) cnt-=2; } } } } cout<<cnt<<endl; while(!q.empty())q.pop(); memset(vis,0,sizeof(vis)); return ;}int main(){ while(cin>>n>>m>>r>>c) { if(n==m&&r==c&&n==r&&n==0) break; for(int i=0;i<n;i++) for(int j=0;j<m;j++) { cin>>maze[i][j]; if(maze[i][j]=='.') vis[i][j]=-1; else if(maze[i][j]=='X') vis[i][j]=0; } bfs(); } return 0;}
0 0
- poj 1111bfs
- POJ-1111---Image Perimeters (bfs)
- [BFS] poj
- POJ 1111 Image Perimeters【单身快乐】【Bfs】
- poj 3626 简单bfs
- POJ 3278 : 经典BFS
- poj 3126 简单bfs
- poj 3278 简单bfs
- poj 2243 bfs
- poj 1856 bfs
- POJ 3697 BFS暴力
- POJ 2251 BFS
- poj 3278 bfs
- POJ 3414 Pots BFS
- poj 3278、、、BFS
- poj--2243 BFS
- POJ 1465 Multiple BFS
- bfs poj 2157 maze
- log4j.properties配置详解
- Git 常用操作
- NYOJ-开灯问题
- OpenSSLRSA.h
- 推荐系统重要会议和期刊
- poj 1111bfs
- jQuery学习笔记之事件
- php需要做的安全防护
- HTML网页开发学习笔记(燕十八)-41 字符实体
- 【开源框架】Android之史上最全最简单最有用的第三方开源库收集整理,有助于快速开发,欢迎各位网友补充完善
- 不同数据库中查询前几条记录的用法(SQL Server/MYSQL /Oracle/Postgresql)
- 如何用天纵手机APP快速开发框架开发手机APP
- 通过注册表修改VC6.0的字体
- OpenSSLRSA.cpp