Cod sursa(job #2262402)

Utilizator nnnmmmcioltan alex nnnmmm Data 17 octombrie 2018 11:41:43
Problema A+B Scor 0
Compilator cpp-64 Status done
Runda teme_upb Marime 3.13 kb
#include <cstdio>
#include <cstring>

const int argc[7]={2,0,3,4,4,5,3};

int Get_command_type(char ch)
{
 int r=-1;
 switch(ch)
        {
         case 'I': r=0; break;
         case 'C': r=1; break;
         case 'L': r=2; break;
         case 'V': r=3; break;
         case 'H': r=4; break;
         case 'K': r=5; break;
         case 'F': r=6; break;
         case 'S': r=7; break;
         case 'X': r=8; break;
        }
 return r;
}

const int NMAX=251;
int N,M;
char canvas[NMAX][NMAX];

void Clear()
{
 for(int i=1;i<=N;i++)
     {
      memset(canvas[i],'O',M*sizeof(char));
      canvas[i][M+1]=NULL;
     }
}

void Init(int n,int m)
{
 N=n;
 M=m;
 Clear();
}

void Color_pixel(int x,int y,int color)
{
 canvas[y][x]=color;
}

void Draw_vertical_segment(int x,int y1,int y2,int color)
{
 for(int i=y1;i<y2;i++)
     {
      Color_pixel(i,x,color);
     }
}

void Draw_horizontal_segment(int x1,int x2,int y,int color)
{
 for(int i=x1;i<x2;i++)
     {
      Color_pixel(y,i,color);
     }
}

void Draw_rectangle(int x1,int y1,int x2,int y2,int color)
{
 for(int i=y1;i<=y2;i++)
     {
      for(int j=x1;j<=x2;j++)
          Color_pixel(j,i,color);
     }
}

const int dx[]={0,1,0,-1};
const int dy[]={1,0,-1,0};

bool Is_in_range(int x,int n)
{
 return x>0 && x<=n;
}

void Fill(int x,int y,int color)
{
 for(int d=0;d<4;d++)
     {
      int x1=x+dx[d],y1=y+dy[d];
      if(!Is_in_range(x1,N) || !Is_in_range(y1,M))
         return;
      if(canvas[y1][x1]==canvas[y][x])
         {
          Color_pixel(x,y,color);
          Fill(x1,y1,color);
         }
     }
}

void Save(char *name,FILE *out)
{
 fprintf(out,"%s\n",name);
 for(int i=1;i<=N;i++)
     {
      fprintf(out,"%s\n",canvas[i]+1);
     }
}

bool Run_command(FILE *in,FILE *out)
{
 char command;
 fscanf(in,"%c ",&command);
 int args[10];
 if(Get_command_type(command)==-1)
    {
     while(command!='\n')
           {
            command=fgetc(in);
           }
     return false;
    }
 if(Get_command_type(command)<7)
    {
     for(int i=0;i<argc[Get_command_type(command)];i++)
         fscanf(in,"%d ",&args[i]);
     switch(command)
            {
             case 'I': Init(args[0],args[1]); break;
             case 'C': Clear(); break;
             case 'L': Color_pixel(args[0],args[1],args[2]); break;
             case 'V': Draw_vertical_segment(args[0],args[1],args[2],args[3]); break;
             case 'H': Draw_horizontal_segment(args[0],args[1],args[2],args[3]); break;
             case 'K': Draw_rectangle(args[0],args[1],args[2],args[3],args[4]); break;
             case 'F': Fill(args[0],args[1],args[2]); break;
            }
    }
 else
    {
     if(command=='X')
        return true;
     char name[100];
     fgets(name,strlen(name),in);
     if(name[strlen(name)-1]=='\n')
        name[strlen(name)-1]=NULL;
     Save(name,out);
    }
 return false;
}

int main()
{
 FILE *in=fopen("a.in","r"),*out=fopen("a.out","w");
 bool quit=false;
 while(!quit)
       {
        quit=Run_command(in,out);
       }
 fclose(in);
 fclose(out);
 return 0;
}