| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
AC了,尽管时间和内存不是很理想。关键点要注意每个RLE的首换行首格和末行首格////////////////////////////////////////////////////////////////
// Poj 1009: Edge Detection Author: Mayfly
// Memory: 596K Time: 79MS
// Language: C++ Result: Accepted
////////////////////////////////////////////////////////////////
#include<iostream>
#include<map>
using namespace std;
#define MAX_SIZE 1001
// 带参宏效率远高于math库函数
#define ABS(x) ( (x) < 0 ? -(x) : (x) )
#define MAX(a,b) ( (a) > (b) ? (a) : (b) )
// 记录关键点及周围8方向格子结果
typedef map<unsigned int, unsigned char> Pixel;
Pixel pix;
// 输入记录
int RLE[MAX_SIZE][3];
int width/* 表格宽度 */, total/* 表格格子总数 */, count/* RLE pairs 长度 */;
// 从RLE中获取第i个格子的输入值(二分查找)
unsigned char GetValue( int i )
{
int left = 0;
int right = count-1;
/*if( RLE[right][2] <= i )
return RLE[right][0];*/
int middle;
while(left<right)
{
middle = ( left + right ) >> 1;
if( i< RLE[middle][2] )
right = middle - 1;
else if( i > RLE[middle+1][2] )
left = middle + 1;
else if( i == RLE[middle+1][2] )
return RLE[middle+1][0];
else
return RLE[middle][0];
}
return RLE[right][0];
}
// 填写第i个格子的输出值
void SetValue( int i )
{
if( pix[i] > 0 ) return;
unsigned char ret = 0;
int col = i % width;
if( i >= width )
{
// ↑
ret = MAX( ABS( GetValue( i ) - GetValue( i-width ) ), ret );
// ↖
if( col > 0 )
ret = MAX( ABS( GetValue( i ) - GetValue( i-width-1 ) ), ret );
// ↗
if( col < width-1 )
ret = MAX( ABS( GetValue( i ) - GetValue( i-width+1 ) ), ret );
}
if( i < total-width )
{
// ↓
ret = MAX( ABS( GetValue( i ) - GetValue( i+width ) ), ret );
// ↙
if( col > 0 )
ret = MAX( ABS( GetValue( i ) - GetValue( i+width-1 ) ), ret );
// ↘
if( col < width-1 )
ret = MAX( ABS( GetValue( i ) - GetValue( i+width+1 ) ), ret );
}
// ←
if( col > 0 )
ret = MAX( ABS( GetValue( i ) - GetValue( i-1 ) ), ret );
// →
if( col < width-1 )
ret = MAX( ABS( GetValue( i ) - GetValue( i+1 ) ), ret );
pix[i] = ret;
}
// 处理第i个格子及其周围8方向的格子(调用SetValue函数,含出界判断)
void DealAround( int i )
{
// 中间(自己)
SetValue( i );
int col = i % width;
//int row = i / width;
if( i >= width )
{
// ↑
SetValue( i-width );
// ↖
if( col > 0 )
SetValue( i-width-1 );
// ↗
if( col < width-1 )
SetValue( i-width+1 );
}
if( i < total-width )
{
// ↓
SetValue( i+width );
// ↙
if( col > 0 )
SetValue( i+width-1 );
// ↘
if( col < width-1 )
SetValue( i+width+1 );
}
// ←
if( col > 0 )
SetValue( i-1 );
// →
if( col < width-1 )
SetValue( i+1 );
}
// 通过RLE分析哪些为关键点(每个RLE的首节点、第一个换行、最后一个换行)
void Analysis()
{
int i, col, row, enter;
for( int l=0; l<count; )
{
i = RLE[l][2];
col = i % width;
row = i / width;
// 每个RLE pairs的开头即为关键点之一
DealAround(i);
// 上一个RLE的最后一个跨行首格
if( col > 1 ) // 当前RLE开始于第1、2列时,enter会被标记
{
enter = ( RLE[l][2] - 1 ) / width * width;
DealAround( enter );
}
// 第一个跨行首格
enter = ( row + 1 ) * width;
if( enter < RLE[++l][2]-1 ) // 当enter紧临结尾时,会被下一个RLE开头标记
DealAround( enter );
}
// 最后一个RLE的第一个跨行首格
enter = ( RLE[count-1][2] + 1 ) * width;
if( enter < total )
DealAround( enter );
/*// 处理换行的第一个节点,当width=3时,行数最多,为最坏情况(此方法会导致内存超限)
if( width > 2 )
{
for( int i=width; i<total; i+=width )
SetValue( i );
}*/
}
// 根据map中记录的关键点等计算值,按格式要求输出结果
void Output()
{
Pixel::iterator it = pix.begin();
unsigned char value = it->second;
int i = 0, start = 0;
cout << width << endl;
while(1)
{
while( value == it->second )
{
++it;
++i;
if( pix.end() == it )
{
cout << (int)value << ' ' << total-start << endl;
cout << "0 0\n";
pix.clear();
return;
}
}
cout << (int)value << ' ' << it->first-start << endl;
start = it->first;
value = it->second;
}
}
int main()
{
while(1)
{
cin>>width;
if( 0 == width ) break;
total = 0;
for( int i=0; i<MAX_SIZE; ++i )
{
cin>>RLE[i][0]>>RLE[i][1];
RLE[i][2] = total;
total += RLE[i][1];
if( 0==RLE[i][0] && 0==RLE[i][1] )
{
count = i;
break;
}
}
//start = clock();
Analysis();
Output();
//cout<<"Time: "<<clock()-start<<endl;
}
cout<<"0\n";
return 0;
}
附一个测试数据:
输入
3
1 2
2 3
6 3
7 4
0 0
0
输出
3
1 1
5 1
4 2
5 2
4 2
5 1
1 3
0 0
0
Followed by:
Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator