Advertisement
Guest User

Untitled

a guest
Mar 21st, 2019
71
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 3.02 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <sys/stat.h>
  4. #include <sys/types.h>
  5. #include <sys/mman.h>
  6. #include <fcntl.h>
  7. #include <string.h>
  8. #include <unistd.h>
  9. #include <inttypes.h>
  10.  
  11. enum Direct { RIGHT, LEFT, UP, DOWN };
  12.  
  13. int main(int argc, char * argv[]) {
  14.     const char * path = argv[1];
  15.     long long rows = strtol(argv[2], NULL, 10);
  16.     long long cols = strtol(argv[3], NULL, 10);
  17.  
  18.     int fd = open(path, O_RDWR, 0); // что-то исправить
  19.     if (fd < 0) abort();
  20.     struct stat st;
  21.     fstat(fd, &st);
  22.     long long sz = rows * cols;
  23.     if (ftruncate(fd, sz * 4) < 0)  abort();
  24.  
  25.     // размер файла фиксируется в момент mmap
  26.     void * ptr = mmap(NULL, sz, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0); // offset - смещение
  27.     if (ptr == MAP_FAILED) abort();
  28.  
  29.     //printf("YES\n");
  30.  
  31.     int *eptr =  (int *) ((char*) ptr + sz * 4);
  32.     int *cptr =  (int *) (ptr);
  33.     for (;cptr < eptr; ++cptr) {
  34.         *cptr = -1;
  35.     }
  36.     long long k = 0;
  37.     int i = 0, j = 0;
  38.     enum Direct way = RIGHT;
  39.     while (k < sz) {
  40.         //printf("%d %d %lld\n", i, j, k + 1);
  41.         int * cptr = (int *) ((char*) ptr + (i * cols + j) * 4);
  42.         *cptr = k + 1;
  43.         if (way == RIGHT) {
  44.             if (j + 1 < cols) {
  45.                 int * next = (int *) ((char*) ptr + (i * cols + j + 1) * 4);
  46.                 if (*next == -1) {
  47.                     ++j;
  48.                 } else {
  49.                     way = DOWN;
  50.                     ++i;
  51.                 }
  52.             } else {
  53.                 way = DOWN;
  54.                 ++i;
  55.             }
  56.             ++k;
  57.             continue;
  58.         }
  59.         if (way == DOWN) {
  60.             if (i + 1 < rows) {
  61.                 int * next = (int *) ((char*) ptr + ((i + 1) * cols + j) * 4);
  62.                 if (*next == -1) {
  63.                     ++i;
  64.                 } else {
  65.                     way = LEFT;
  66.                     --j;
  67.                 }
  68.             } else {
  69.                 way = LEFT;
  70.                 --j;
  71.             }
  72.             ++k;
  73.             continue;
  74.         }
  75.         if (way == LEFT) {
  76.             if (j - 1 >= 0) {
  77.                 int * next = (int *) ((char*) ptr + (i * cols + j - 1) * 4);
  78.                 if (*next == -1) {
  79.                     --j;
  80.                 } else {
  81.                     way = UP;
  82.                     --i;
  83.                 }
  84.             } else {
  85.                 way = UP;
  86.                 --i;
  87.             }
  88.             ++k;
  89.             continue;
  90.         }
  91.         if (way == UP) {
  92.             if (i - 1 >= 0) {
  93.                 int * next = (int *) ((char*) ptr + ((i - 1) * cols + j) * 4);
  94.                 if (*next == -1) {
  95.                     --i;
  96.                 } else {
  97.                     way = RIGHT;
  98.                     ++j;
  99.                 }
  100.             } else {
  101.                 way = RIGHT;
  102.                 ++j;
  103.             }
  104.             ++k;
  105.             continue;
  106.         }
  107.     }
  108.     close(fd);
  109.     munmap(ptr, st.st_size);
  110. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement