洛谷 P1845 影像之结构化特征_NOI导刊2011提高(12)
来源:互联网 发布:js判断对象{}是否为空 编辑:程序博客网 时间:2024/06/05 09:37
洛谷 P1845 影像之结构化特征_NOI导刊2011提高(12)
题目
题目描述
在影像比对中,有一种方法是利用影像中的边缘(edge)资讯,计算每个边缘资讯中具有代表性的结构化特征,以作为比对两张影像是否相似的判断标准。Water-filling方法是从每个边缘图的一个端点开始,绕着相连的边缘点走并依序编号。若走到某一步时,遇到一个以上不同的连接点,则分成不同路径同时继续走,直到没有任何连接点为止。如果一个点和另一个点为上下左右相邻,就称为连接。
例如,在图1的影像中包含三个边缘图,每个边缘图由一些互相连接的边缘点构成。图中以黑色的方块代表边缘点,白色的方块代表背景。在Water-filling方法中,首先,从第一行(row)开始,由左至右,由上至下,先找到第一个黑点并编号为1。接着,找1的下一个尚未编号的连接点并编号为2。依此方法继续往下一个点前进依次编号。在编号6的点之后有两个尚未编号的连接点,此时,则分为两条路线,并同时编号为7继续往下走。当走到没有任何的相连点时,则结束现有边缘图的编号,并继续对影像中的其它边缘图编号。走完图1所有边缘图后所得到的编号如图2所示。所以,走完这三个边缘图所需要的步数分别为12、7及3;所以,12、7及3可以作为代表此张影像的结构化特征。请注意:位于斜对角上的两点不能算做连接,如:
请写一个程序计算每个影像中,以Water-filling方法走完其中所有的边缘图后,将每个边缘图需走的步数依走访的顺序列出。
输入输出格式
输入格式:
输入文件包含一个正方形的影像。每组影像以图的宽度n开头(l≤n≤1000)。接下来的n行代表影像的内容:0表示背景的白点,1表示黑色的边缘点。
输出格式:
对每一个输入的影像,以Water-filling方法走完所有的边缘图后,先印出此张影像中共有几个边缘图。接着,将每个边缘图需走的步数按升序列出。
输入输出样例
输入样例#1:
10 0000000000 0011110000 0000010000 0011111000 0010110100 0010010110 0011110010 0100010010 0100000110 0100000000
输出样例#1:
3 3 7 12
题解
BFS(就当练个手吧)
代码
#include<cstdio>#include<cstring>#include<cstdlib>using namespace std;const int flag[4][2]={{0,1},{1,0},{-1,0},{0,-1}};int n,head,tail,tot;int map[1005][1005],ans[1000005];bool vis[1005][1005];char ch;struct point{ int x,y,z;} q[1000005];bool check(int x,int y){ if (x<1||y<1||x>n||y>n||map[x][y]==0||vis[x][y]) return false; else return true;}void find(int x,int y){ tail++; vis[x][y]=true; q[tail].x=x;q[tail].y=y;q[tail].z=q[head].z+1;}int bfs(int x,int y){ head=0;tail=1; q[1].x=x;q[1].y=y;q[1].z=1;vis[x][y]=true; while (head<tail) { head++; int xx=q[head].x,yy=q[head].y; for (int i=0;i<4;i++) if (check(xx+flag[i][0],yy+flag[i][1])) find(xx+flag[i][0],yy+flag[i][1]); } return q[tail].z;}void qsort(int l,int r){ int i=l,j=r,mid=ans[rand()%(r-l+1)+l],t; do{ while (ans[i]<mid) i++; while (ans[j]>mid) j--; if (i<=j) { t=ans[i];ans[i]=ans[j];ans[j]=t; i++;j--; } } while (i<=j); if (i<r) qsort(i,r); if (l<j) qsort(l,j);}int main(){ memset(vis,false,sizeof(vis)); scanf("%d",&n); for (int i=1;i<=n;i++) for (int j=1;j<=n;j++) {ch=getchar();while (ch!='1'&&ch!='0') ch=getchar();map[i][j]=ch-48;} for (int i=1;i<=n;i++) for (int j=1;j<=n;j++) if (map[i][j]==1&&!vis[i][j]) ans[++tot]=bfs(i,j); qsort(1,tot); printf("%d\n",tot); for (int i=1;i<=tot;i++) printf("%d\n",ans[i]); return 0;}
- 洛谷 P1845 影像之结构化特征_NOI导刊2011提高(12)
- 洛谷 P1844 阅览室_NOI导刊2011提高(12)
- 洛谷 P1808 单词分类_NOI导刊2011提高(01)
- 洛谷 P1815 蠕虫游戏 _NOI导刊2011提高(02)
- 洛谷 P1801 黑匣子_NOI导刊2010提高(06)
- 洛谷 P1801 黑匣子_NOI导刊2010提高(06)
- 洛谷 P1801 黑匣子_NOI导刊2010提高(06)
- 洛谷 P1801 黑匣子_NOI导刊2010提高(06)
- 黑匣子_NOI导刊2010提高(06) 洛谷p1801
- 洛谷 P1807 最长路_NOI导刊2010提高(07)
- 洛谷 P1776 宝物筛选_NOI导刊2010提高(02)
- 洛谷 P1799 数列_NOI导刊2010提高(06)
- 洛谷P1801 黑匣子_NOI导刊2010提高(06)
- 洛谷P1801 黑匣子_NOI导刊2010提高(06)
- [P1809]过河问题_NOI导刊2011提高(01)
- |洛谷|NOI导刊|堆|黑匣子_NOI导刊2010提高(06)
- spfa进阶使用二分+SLF(洛谷1951 收费站_NOI导刊2009提高(2))
- 洛谷1801 黑匣子_NOI导刊2010提高(06) 【好题】
- 百度2017春招笔试真题[编程题] 度度熊回家
- leetcode-402. Remove K Digits
- 网络复习-运输层
- 面向对象:多态 Polymorphism、重载、重写、继承
- Codeforces Round #439 (Div. 2) E. The Untended Antiquity(二维BIT)
- 洛谷 P1845 影像之结构化特征_NOI导刊2011提高(12)
- STL常用算法(转)
- LYK快跑!(run)
- 浅谈getElementsByClassName
- 页面传参
- 19、C#里面的冒泡排序操作
- Pig数据分析引擎 二 使用PigLatin语句分析数据
- run
- Rxjava操作符官方文档