URAL--1008. Image Encoding

来源:互联网 发布:安装禅道pathinfo.php 编辑:程序博客网 时间:2024/05/21 03:26

其实这一题就是模拟,再者就是考察了输入的一些小技巧,就没有了......

题意:前面的题意我想应该很好理解,重点是第二种编码的理解。

第二种编码方法:首行指定左下角的黑色象素的坐标。以下每行为与它相邻的象素的描述。先是左下角的象素,然后是与它相邻的第一个象素A(如果存在的话),再是与它相邻的第二个象素B(如果存在的话)。当所有相邻的象素都描述完了,接下来就是与A相邻的象素的描述,再是与B相邻的象素的描述,如此类推。
只用一个字母表示相邻,R:在右,T:在上, L:在左,B:在下。一行为一个象素的相邻描述。同一象素不出现2次,如果之前已经描述过,就不用重复描述了。是从右开始,按逆时针方向描述的。每一行的描述以","结束,最后一行的","则改为"."表示文件结束。

#include <cstdio>#include <cstring>#include <cstdlib>#include <iostream>#include<algorithm>#define N 100using namespace std;struct  point{    int x,y;    bool operator < ( const point &a )const//重载运算符,为sort排序做准备    {        if ( x == a.x ) return y < a.y ;        return x < a.x ;    }};int mov[4][2]={1,0,0,1,-1,0,0,-1};int map[N][N];point que[N*N];char condition[100][10],dir[5]="RTLB";//dir与MOV建立对应关系void bfs1(int y,int x){    int fre=0,aft=1;    que[0].x=x;    que[0].y=y;    map[y][x]=0;    point cur,next;    while (fre<aft)    {        cur=que[fre++];        for (int i=0;i<4;i++)        {            int tx,ty;            tx=cur.x+mov[i][0];            ty=cur.y+mov[i][1];            next.x=tx;            next.y=ty;            if (tx>=0&&tx<100&&ty>=0&&ty<100&&map[ty][tx]==1)            {                que[aft++]=next;                map[ty][tx]=0;                printf("%c",dir[i]);            }        }        if (fre!=aft)printf(",\n");        else printf(".\n");    }}void bfs2(int x,int y,int count){    int aft=1,i=0;    que[0].x=x;    que[0].y=y;    while (++i<count)    {        int len=strlen(condition[i]);        for (int j=0;j<len;j++)            for (int k=0;k<4;k++)            {                if (condition[i][j]==dir[k])                {                    que[aft].x=que[i-1].x+mov[k][0];                    que[aft++].y=que[i-1].y+mov[k][1];                    break;                }            }    }}int main(){    int x,y,n,count=0;    while (gets(condition[count])!=NULL&&condition[count][0]!='\0')    {        ++count;    }    memset(map,0,sizeof(map));    if (condition[1][0]>'0'&&condition[1][0]<='9')    {        sscanf(condition[0],"%d",&n);        for (int i=count-1;i>=1;i--)        {            sscanf(condition[i],"%d%d",&x,&y);            map[y-1][x-1]=1;        }        printf("%d %d\n",x,y);        bfs1(y-1,x-1);    }    else    {        sscanf(condition[0],"%d%d",&x,&y);        bfs2(x,y,count);        printf("%d\n",count-1);        sort( que  , que + count - 1 ) ;        for (int i=0;i<count-1;i++)            printf("%d %d\n",que[i].x,que[i].y);    }    return 0;}


0 0
原创粉丝点击