`

1009

阅读更多
总时间限制:
1000ms
内存限制:
65536kB
描述
IONU Satellite Imaging, Inc. records and stores very large images using run length encoding. You are to write a program that reads a compressed image, finds the edges in the image, as described below, and outputs another compressed image of the detected edges.
A simple edge detection algorithm sets an output pixel's value to be the maximum absolute value of the differences between it and all its surrounding pixels in the input image. Consider the input image below:

The upper left pixel in the output image is the maximum of the values |15-15|,|15-100|, and |15-100|, which is 85. The pixel in the 4th row, 2nd column is computed as the maximum of |175-100|, |175-100|, |175-100|, |175-175|, |175-25|, |175-175|,|175-175|, and |175-25|, which is 150.
Images contain 2 to 1,000,000,000 (109) pixels. All images are encoded using run length encoding (RLE). This is a sequence of pairs, containing pixel value (0-255) and run length (1-109). Input images have at most 1,000 of these pairs. Successive pairs have different pixel values. All lines in an image contain the same number of pixels.
输入
Input consists of information for one or more images. Each image starts with the width, in pixels, of each image line. This is followed by the RLE pairs, one pair per line. A line with 0 0 indicates the end of the data for that image. An image width of 0 indicates there are no more images to process. The first image in the example input encodes the 5x7 input image above.
输出
Output is a series of edge-detected images, in the same format as the input images, except that there may be more than 1,000 RLE pairs.
样例输入
7
15 4
100 15
25 2
175 2
25 5
175 2
25 5
0 0
10
35 500000000
200 500000000
0 0
3
255 1
10 1
255 2
10 1
255 2
10 1
255 1
0 0
0
样例输出
7
85 5
0 2
85 5
75 10
150 2
75 3
0 2
150 2
0 4
0 0
10
0 499999990
165 20
0 499999990
0 0
3
245 9
0 0
0
提示
A brute force solution that attempts to compute an output value for every individual pixel will likely fail due to space or time constraints.
最近比较累,有时间又去搞web去了,做这种题我认为最打的 收获就是增进我对语言的了解和使用程度。
这道题让很多人痛心疾首啊!无奈啊!
 
 
解决方案一: G++
 
 
#include<stdio.h>
#include<cstdlib>
typedef struct Pixel{
  int index ;//位置
  int code ;//值
} Pl;
int IN[1000][2] ;//存储输入的数据
Pl OUT[8000] ;//存储要输出的数据
int getCode(int n) ;
int enCode(int n,int width,int total) ;
void sort(Pl* list,int n) ;
int main()
{
  int width,i,j,total,line,n,k,m,row,col,t;
  Pl px ;
  while(scanf("%d",&width)!= EOF)//width为0跳出
  {
      if(width==0) break ;

/**
输入
*/
   i = total = 0 ;
   scanf("%d%d",&IN[i][0],&IN[i][1]) ;
   while(IN[i][0]!=0 || IN[i][1]!=0)
    {
        total+=IN[i][1] ;//计算总像素点
        i++ ;
        scanf("%d%d",&IN[i][0],&IN[i][1]) ;
    }

    printf("%d\n",width) ;//输出宽度
/**
计算
*/
    line = i ;
    n = 1 ;
    k = 0 ;
   for(m=0;m<=line;m++)//
   {
      row = (n-1) / width ;//求得元素所在的行
      col = (n-1) % width ;//求得元素所在的列
/**
通过遍历获得元素周围的8个元素
*/
   for(i=row-1;i<=row+1;i++){
    for(j=col-1;j<=col+1;j++){
      t = i * width + j ; //t为元素所在的位置
      if(i<0 || j<0 || t>total-1 || j>width-1) //不符合条件的跳过
         {  continue ;  }
     OUT[k].index = t + 1;
     OUT[k++].code = enCode(t+1,width,total) ;
    }
   }
   n += IN[m][1] ;
}
/**
输出
*/
sort(OUT,k) ;
  px = OUT[0] ;
  for(i=0;i<k;i++)
  {
    if(OUT[i].code==px.code)
        continue ;

  printf("%d %d\n",px.code,OUT[i].index-px.index) ;
    px = OUT[i] ;
  }
printf("%d %d\n", px.code, total - px.index + 1);
  printf("0 0\n");
  }
  printf("0\n");
  return 0 ;
}
/**
返回第n个元素的编码,n从1开始
*/
int getCode(int n)
{
    int t,i ;
    i = t = 0 ;
   while(t<n)
   {
       t += IN[i++][1] ;
   }
   return IN[i-1][0] ;
}
/**
对第n个元素进行编码,n从1开始
*/
int enCode(int n,int width,int total)
{
    int i,j,t,code,result,row,col;
    code = getCode(n) ;//得到该元素编码
    row = (n-1) / width ;
    col = (n-1) % width ;
    result = 0 ; //记录绝对值最大的数
    for(i=row-1;i<=row+1;i++){
        for(j=col-1;j<=col+1;j++){
            t = i*width + j ;
            if(i<0||j<0||t>total-1||j>width-1||t==n-1)
                continue ;

            if(abs(getCode(t+1)-code)>result)
             result = abs(getCode(t+1)-code) ;
            }
          }
        return result ;
}
/**
排序
*/
void sort(Pl *list,int n)
{
    Pl tmp ;
    int i,j ;
    for(i=0;i<n;i++){
    for(j=i+1;j<n;j++){
        if(list[i].index > list[j].index)
        {
            tmp = list[i] ;
            list[i] = list[j] ;
            list[j] = tmp ;
        }
    }
    }
}




 
 
 
 
 
 
解决方案二: Java
 
 
package dsa;

import java.util.Scanner;

public class Demo11 {
  int IN[][] = new int[1000][2] ;
  Pixel OUT[] = new Pixel[8000] ;
	
public static void main(String args[])
	{
		new Demo11().test() ;
	}
public void test()
{
	int width,i,j,total,line,n,k,m,row,col,t;
	Pixel px = new Pixel() ;
	Scanner sc = new Scanner(System.in);
	while(sc.hasNext())
	{
		width = sc.nextInt() ;
		if(width==0) break ;
		i = total = 0 ;
		IN[i][0] = sc.nextInt() ;
		IN[i][1] = sc.nextInt() ;
		while(IN[i][0]!=0 || IN[i][1]!=0)
	    {
	        total+=IN[i][1] ;
	        i++ ;
	        IN[i][0] = sc.nextInt() ;
			IN[i][1] = sc.nextInt() ;
	    }
		System.out.printf("%d\n",width) ;

	    line = i ;
	    n = 1 ;
	    k = 0 ;
	   for(m=0;m<=line;m++)//
	   {
	      row = (n-1) / width ;//求得元素所在的行
	      col = (n-1) % width ;//求得元素所在的列
	/**
	通过遍历获得元素周围的8个元素
	*/
	   for(i=row-1;i<=row+1;i++){
	    for(j=col-1;j<=col+1;j++){
	      t = i * width + j ; //t为元素所在的位置
	      if(i<0 || j<0 || t>total-1 || j>width-1) //不符合条件的跳过
	         {  continue ;  }
	      OUT[k] = new Pixel() ;
	     OUT[k].index = t + 1;
	     OUT[k++].code = enCode(t+1,width,total) ;
	    }
	   }
	   n += IN[m][1] ;
	}
	   sort(OUT,k) ;
	  px = OUT[0] ;
	  for(i=0;i<k;i++)
	  {
	    if(OUT[i].code==px.code)
	        continue ;
	    
	System.out.printf("%d %d\n",px.code,OUT[i].index-px.index) ;
	 
	    px = OUT[i] ;
	  }
	  System.out.printf("%d %d\n", px.code, total - px.index + 1);
	  System.out.printf("0 0\n");
	  }
	
	System.out.printf("0\n");   
}
public int  getCode(int n)
{
	int t,i ;
    i = t = 0 ;
   while(t<n)
   {
       t += IN[i++][1] ;
   }
   return IN[i-1][0] ;
}
public int enCode(int n,int width,int total)
{

    int i,j,t,code,result,row,col;
    code = getCode(n) ;//得到该元素编码
    row = (n-1) / width ;
    col = (n-1) % width ;
    result = 0 ; //记录绝对值最大的数
    for(i=row-1;i<=row+1;i++){
        for(j=col-1;j<=col+1;j++){
            t = i*width + j ;
            if(i<0||j<0||t>total-1||j>width-1||t==n-1)
                continue ;

            if(Math.abs(getCode(t+1)-code)>result)
             result = Math.abs(getCode(t+1)-code) ;
            }
          }
        return result ;
}
public void sort(Pixel[] list,int n){
	Pixel tmp = new Pixel();
	int i,j ;
	 for(i=0;i<n-1;i++){
		    for(j=i+1;j<n;j++){
		        if(list[i].index > list[j].index)
		        {
		            tmp = list[i] ;
		            list[i] = list[j] ;
		            list[j] = tmp ;
		        }
		    }
		    }
	 
}
 class Pixel{
		int index ;
		int code  ;
	}

}
 
不知道为什么,java的过不了,答案对上了,如果有大神知道的话,请告诉我一下。
分享到:
评论

相关推荐

    POJ1009-Edge Detection

    【标题】"POJ1009 - 边缘检测" 在计算机图形学与图像处理领域,边缘检测是一项至关重要的技术。北京大学编程平台POJ上的第1009题,"Edge Detection"(边缘检测),旨在让学生通过编程实现对图像进行边缘检测。此题...

    XM1008XM1009数据手册V1.051

    《XM1008/XM1009数据手册V1.051》是针对这两款微控制器的详细技术文档,提供了丰富的硬件设计和应用信息。以下将围绕标题和描述中的关键知识点进行深入解析: **1. 供电方案** 在微控制器的设计中,供电方案是至关...

    Everything-1.4.1.1009.x64.zip

    下载的压缩包名为"Everything-1.4.1.1009.x64.zip",其中包含两个文件:"Everything.exe"是主程序,"Everything.lng"则是语言包,用于设置软件界面的语言。安装时,只需双击"Everything.exe",然后在弹出的界面中...

    Everything-1.4.1.1009.x86 免安装版

    标题中的"1.4.1.1009.x86"指的是软件的版本号和体系结构,这里的"x86"意味着它适用于32位操作系统。"免安装版"意味着你可以直接下载压缩包,解压后无须通过传统安装过程即可运行程序。 "Everything"的主要特点和...

    Everything-1.4.1.1009.x64-Setup文件快速搜索工具64位.rar

    今天我们要探讨的版本是Everything-1.4.1.1009.x64-Setup文件快速搜索工具64位,它为64位操作系统用户提供了一种高效且便捷的文件搜索解决方案。 “Everything”这个名字准确地反映了这款工具的核心功能——让文件...

    KXTJ2-1009资料

    ### KXTJ2-1009 加速度传感器知识点详解 #### 一、产品概述 **KXTJ2-1009**是KIONIX公司出品的一款三轴加速度传感器,该产品提供了±2g、±4g、±8g三种量程选择,能够满足不同应用场景的需求。传感器的核心部分...

    MyColor1009.rar

    《颜色世界探索:MyColor1009——您的专业取色助手》 在数字时代,颜色不仅是视觉艺术的重要元素,也是界面设计、网页设计、软件开发等IT领域不可或缺的组成部分。"MyColor1009.rar"这个压缩包,正是为帮助用户轻松...

    Allok Video to FLV Converter 4.6.1009 汉化版

    Allok Video to FLV Converter 4.6.1009 汉化版 三大特色功能: ∷既可输出FLV格式,也可输出SWF格式,甚至同时输出FLV+SWF格式。此软件也支持创建调用播放的网页 ∷支持导入所有的主流字幕格式(*.srt,*.sub,*.idx,*...

    CHT 1009-2001 基础地理信息数字产品 数字正射影像图.zip

    《CHT 1009-2001 基础地理信息数字产品 数字正射影像图》是关于地理信息系统(GIS)领域的重要标准,它规定了数字正射影像图(DOM)的制作、存储和应用的技术要求。这份资料主要涵盖了以下几个核心知识点: 1. **...

    Everything-1.4.1.1009.x86-Setup文件快速搜索工具32位.rar

    "Everything-1.4.1.1009.x86-Setup文件快速搜索工具32位.rar" 是一个用于Windows操作系统的实用程序,专为32位(x86)架构设计。这个压缩包包含了名为 "Everything-1.4.1.1009.x86-Setup文件快速搜索工具32位.exe" ...

    SFF-TA-1009 Rev 2.0.pdf

    SFF-TA-1009 Specification for Enterprise and Datacenter SSD Pin and Signal Specification Rev 2.0 May 22, 2018

    pku acm 1009

    标题 "pku acm 1009" 暗示了这是一个与北京大学(Peking University)的ACM(国际大学生程序设计竞赛)相关的题目,编号为1009。ACM竞赛是全球知名的编程竞赛,旨在提升大学生的算法设计、编程和问题解决能力。在这样...

    CH1009-2001+数字正射影像图.pdf

    一、关于中华人民共和国测绘行业标准CH/T1009-2001 1. 标准编号及名称:CH/T1009-2001,全称为中华人民共和国测绘行业标准《基础地理信息数字产品1:10000、1:50000数字正射影像图》。 2. 发布与实施时间:该标准于...

    poj1009 Edge Detection 可以直接AC的

    poj1009 Edge Detection 可以直接AC的

    Everything-1.4.1.1009.x64-Setup.rar

    安装文件"Everything-1.4.1.1009.x64-Setup.exe"是用于在电脑上部署"Everything"的安装程序,用户只需运行这个程序,按照向导指引进行安装,即可在自己的系统上享受"Everything"带来的高效搜索体验。 总之,...

    Everything-1.4.1.1009.x64-Setup.7z

    "Everything-1.4.1.1009.x64-Setup.7z" 是一个包含"Everything"应用程序的64位版本安装程序的压缩文件。"Everything"是一款高效且快速的文件和文件夹搜索工具,尤其适用于大型硬盘驱动器上的数据检索。这款软件以其...

    U1009--网络技术必备

    U1009--网络技术必备 会而不翻的人是可耻的

    CHT 1009-2001 基础地理信息数字产品 数字正射影像图.pdf

    文件《CHT 1009-2001 基础地理信息数字产品 数字正射影像图.pdf》涉及的是中华人民共和国测绘行业标准,编号为CHT 1009-2001。这项标准是国家测绘局为满足数字化测绘生产和基础地理信息更新与建库的需要而制定的,...

    KIEN1009产品单页.pdf

    KIEN1009产品单页pdf,9口非网管型卡轨式交换机

    SFF-TA-1009 Enterprise and Datacenter Standard Pin and Signal Specification.pdf

    SFF-TA-1009 Enterprise and Datacenter Standard Pin and Signal Specification (EDSFF)

Global site tag (gtag.js) - Google Analytics