Пример упаковки/разпаковки части лабиринта


#include <stdio.h>
#include <string.h>

#define MAPW 10
#define MAPH 10

#define SEE_RADIUS 3

char map[10*10] =
"1111111111"
"1 1 1"
"1 11 1 1 1"
"1 X1 1 1 1"
"1111 1 111"
"1 1 1"
"11 11111 1"
"1 1 1 1"
"1 1"
"1111111111";

void drawMap(char *map)
{

for(int i=0;i<MAPW*MAPH;i++)
{
printf("%c",map[i]);
if ((i+1)%MAPW==0) printf("
");
}

}

void packMap(int x,int y,char *temp)
{
char *p=temp;

//определяем максимальную разрядность
int n=4;
if (MAPW*MAPH<4095) n=3;
if (MAPW*MAPH<255) n=2;

for(int i=x-SEE_RADIUS;i<x+SEE_RADIUS;i++)
for(int j=y-SEE_RADIUS;j<y+SEE_RADIUS;j++)
if (i>=0&&j>=0&&i<MAPW&&j<MAPH)
{
char c = map[j*MAPW+i];
char d = 0;

if (c=='1') d=1;

char str[10];
sprintf(str,"%0*X%c",n,j*MAPW+i,'A'+d);
//printf("kk = %d %s
",j*MAPW+i,str);
strcpy(p,str);
p+=strlen(str);

}

*p=0;

}

void unpackMap(char *src,char *dst)
{
//определяем максимальную разрядность
int n=4;
if (MAPW*MAPH<4095) n=3;
if (MAPW*MAPH<255) n=2;
for(int i=0;src[i];i++)
{
int k=0;

for(int j=0;j<n;j++)
{
int c=src[i+j];
if (c>='A') c=c-'A'+10;
else c-=48;

//k += c^j;
if ((n-1)-j==0) k+=c;
if ((n-1)-j==1) k+=c*16;
if ((n-1)-j==2) k+=c*256;
if ((n-1)-j==3) k+=c*4096;
}

int x=k%MAPW;
int y=k/MAPW;
char c = src[i+n]-'A';

if (c==0) c=' ';
else if (c==1) c='1'; else c='?';

dst[y*MAPW+x]=c;
i+=n;
}

}

int main()
{

drawMap(map);

char temp[512];

printf("pack
");
packMap(2,3,temp);
printf("%s
",temp);

char newmap[MAPW*MAPH];
memset(newmap,'*',sizeof(newmap));
printf("unpack
");
unpackMap(temp,newmap);

drawMap(newmap);

return 0;
}