2015-11-24 5 views
2

Все, что я хочу, это заполнить массив B массивом с 30 случайными 1, которые не являются рядом друг с другом, а не с первой или последней строкой, ни в первой, ни в последней строке. Я пытаюсь сделать это, создав еще один массив с именем empodia, чтобы получить там случайные числа (сформированные так, чтобы они были в границах массива B), но я не могу сделать это правильно. Я не хочу делать это с указателями. Спасибо за вашу помощь!Программирование в C-Game

#include <stdio.h> 
    #include <stdlib.h> 
    #include <time.h> 
    #define N 23 
    #define M 79 
    int main() 
    { 
     int i,j,a,b,epilogi,seira,stili; 
     char A[N][M]; 
     int B[N][M],empodia[15][2]; 
     srand(time(NULL)); 

     for(a=0;a<15;a++) 
     { 
      for(b=0;b<2;b++) 
      { 
       do{ 
       seira=2+rand()%18; //i want to get a random number from 2-20 
       stili=2+rand()%76; //i want to get a random number from 2-77 
       }while(B[seira][stili]==1 || B[seira-1][stili-1]==1 || B[seira-1][stili+1]==1 || B[seira+1][stili-1]==1 || B[seira+1][stili+1]==1 || B[seira][stili-1]==1 || B[seira][stili+1]==1 || B[seira-1][stili]==1 || B[seira+1][stili]==1); //so that i will not get numbers one next to each other 

       empodia[a][0]= seira; 
       empodia[a][b+1]=stili; 
       B[seira][stili]=1; 
      } 
     } 

     for (i=0;i<N;i++) 
     { 
      for (j=0;j<M;j++) 
      { 
       if((i==0) || (j==M)) 
       { 
       B[i][j]= 1; 
       } 
       else if ((i==N) || (j==0)) 
       { 
        B[i][j]= 1; 
       } 
       else if ((i==N-1)|| (j==M)) 
       { 
        B[i][j]= 1; 
       } 
       else if ((i==N) || (j==M-1)) 
       { 
        B[i][j]= 1; 
       } 

       else if(B[i][j]!=1) 
       { 
        B[i][j]= 0; 
       } 
      } 
     } 

     for (i=0;i<N;i++) 
     { 
      for (j=0;j<M;j++) 
      { 
       printf("%d",B[i][j]); 
      } 
      printf("\n"); 
     } 

     return 0; 
    } 
+0

Каково точное значение «рядом друг с другом»? Каждая соседняя ячейка (включая диагональные) считается «рядом друг с другом»? – BlueStrat

+0

Использование однобуквенных макросов очень опасно. В genral, youz должен избегать таких имен также для другого кода на уровне файла. Вместо этого используйте более описательные имена. – Olaf

+0

Bluestar: да даже диагональные –

ответ

0

спасибо за такую ​​интересную проблему. вот мой код, который должен работать. не забудьте заполнить массив col каждый раз перед запуском операции.

bool col[N+3][M+3]; ///a color array to check availability 
int rrr[]= {1,1,0,-1,-1,-1,0,1}; ///8 direction 
int ccc[]= {0,1,1,1,0,-1,-1,-1}; ///8 direction 

for(int i=0; i<30; i++){ ///for 30 random numbers 
    while(1){ ///loop to detect a random available position 
     int xx,yy; 
     xx = 2+rand()%18; 
     yy = 2+rand()%76; 
     if(!col[xx][yy]){ ///checking availability 
      B[xx][yy]=1; ///setting 1 
      col[xx][yy]=true;   ///making all the neighboring 
      for(int j=0; j<8; j++){ ///points unavailable 
       col[xx+rrr[j]][yy+ccc[j]]=true; 
      } 
      break; ///break when finds an available position 
     } 
    } 
} 
+0

что делать, если мы находимся в N + 3 массива bool? –

+0

никогда не будет там. потому что мы модифицируем случайные значения на '18' и' 76', которые по крайней мере на '3' меньше, чем' N & M' @ D.Gial – jbsu32

+0

по какой-то причине, похоже, это не работает –