POJ 1111 Image Perimeters
2016-02-29 22:29
351 查看
题目大意:
输入一个矩阵,再输入其中一个“X”的位置(从1开始)。从该位置向八个方向扩展,如果是“X”就可以并在一起。问最后得到的模块的周长是多少。
网上说这题用广搜比较好。。。不过我还没看,用了深搜。
找到连续的图像不麻烦,但是计算周长难到我了。
每个方块初始周长都是4,如果它四周每存在一个方块周长就会减少1,把每个方块的有效周长加在一起就是这个图像的周长。
输入一个矩阵,再输入其中一个“X”的位置(从1开始)。从该位置向八个方向扩展,如果是“X”就可以并在一起。问最后得到的模块的周长是多少。
网上说这题用广搜比较好。。。不过我还没看,用了深搜。
找到连续的图像不麻烦,但是计算周长难到我了。
每个方块初始周长都是4,如果它四周每存在一个方块周长就会减少1,把每个方块的有效周长加在一起就是这个图像的周长。
#include <iostream> #include <string.h> #include <stdio.h> #include <math.h> #include <map> #include<queue> using namespace std; int xa,ya,posx,posy; int isok[105][105]; int dis1[8]={0,0,1,-1,-1,-1,1,1,}; int dis2[8]={1,-1,0,0,-1,1,-1,1}; int res; void dfs(int x,int y) { int c=4; if(isok[x][y]==3) return; isok[x][y]=3; for(int i=0;i<8;i++) { int xx=x+dis1[i]; int yy=y+dis2[i]; if((!isok[xx][yy])||xx<0||yy<0||xx>=xa||yy>=ya) continue; dfs(xx,yy); if(dis1[i]==0||dis2[i]==0) c--; } res+=c; } int main() { while(cin>>xa>>ya>>posx>>posy) { if(!(xa||ya||posx||posy)) break; res=0; for(int i=0;i<xa;i++) { char c; for(int j=0;j<ya;j++) { cin>>c; if(c=='X') isok[i][j]=1; else isok[i][j]=0; } } dfs(posx-1,posy-1); cout<<res<<endl; } }
相关文章推荐
- URL详解
- 第三百三十三天 how can I 坚持
- 7. 常用控件(2)
- web前端面试题集锦
- Session机制详解
- 个人介绍
- Spring MVC过滤器-委派过滤器代理(DelegatingFilterProxy)
- Singly Linked List & Destructor - C++ for C Programmers 3.4
- 单数组哈希表unordered_map和unordered_set(转)
- HBase源码分析之HRegionServer上MemStore的flush处理流程(一)
- LeetCode 268 Missing Number(丢失的数字)
- Qt5下实现摄像头预览及捕获图像方法一
- 图文消息回复
- 我的第一个comet长连接例子
- [译]PostCSS介绍
- Linux就这个范儿 第9章 特种文件系统
- C语言回顾与再学习——基本概念
- 用gparted给ubuntu调整分区
- Memcached集群/分布式/高可用 及 Magent缓存代理搭建过程 详解
- this project needs to migrate WTP metadata 异常解决办法