ICEMAN
چهارشنبه 05 دی 1386, 09:21 صبح
سلام ...
هرکس میره دانشگاه یا میخواد برنامه نویسی یاد بگیره یکی از Exercise های کتاب یا استاد سوال Maze هست .حل کردن و ساختن .
این شاید خوب بهینه و کامل نباشه ولی به عنوان یه راهنمایی فک کنم کافیه
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define UP 1
#define DN 2
#define LT 4
#define RT 8
int addelem(int, int [12][12], int *, int, int);
void openwall(int [12][12], int, int);
void writemaze(int [12][12]);
void main(void)
{
int i, j, base;
int search[150], array[12][12];
for(i=1 ; i<11 ; ++i)
{
array[i][0] = -1;
array[i][11] = -1;
array[0][i] = -1;
array[11][i] = -1;
for(j=1 ; j<11 ; ++j)
array[i][j] = 0;
}
srand((int)time(NULL));
i = rand() % 10 + 1;
j = rand() % 10 + 1;
base = addelem(0, array, search, i, j);
array[i][j] = RT + RT; /* Not a valid value */
while(0 < base)
{
i = rand() % base;
j = search[i];
search[i] = search[--base];
i = j % 100;
j /= 100;
openwall(array, i, j);
base = addelem(base, array, search, i, j);
}
writemaze(array);
}
int addelem(int base, int maze[12][12], int *search, int row, int col)
{
if(0 == maze[row-1][col])
{
search[base++] = row + col * 100 - 1;
maze[row-1][col] = -DN;
}
else if(0 > maze[row-1][col])
maze[row-1][col] -= DN;
if(0 == maze[row+1][col])
{
search[base++] = row + col * 100 + 1;
maze[row+1][col] = -UP;
}
else if(0 > maze[row+1][col])
maze[row+1][col] -= UP;
if(0 == maze[row][col-1])
{
search[base++] = row + col * 100 - 100;
maze[row][col-1] = -RT;
}
else if(0 > maze[row][col-1])
maze[row][col-1] -= RT;
if(0 == maze[row][col+1])
{
search[base++] = row + col * 100 + 100;
maze[row][col+1] = -LT;
}
else if(0 > maze[row][col+1])
maze[row][col+1] -= LT;
return base;
}
void openwall(int maze[12][12], int row, int col)
{
int directions, max, direction, temprow, tempcol, temp, back;
directions = -maze[row][col];
max = 0;
if(directions & UP)
{
temp = rand();
if(temp > max)
{
max = temp;
direction = UP;
back = DN;
temprow = row - 1;
tempcol = col;
}
}
if(directions & DN)
{
temp = rand();
if(temp > max)
{
max = temp;
direction = DN;
back = UP;
temprow = row + 1;
tempcol = col;
}
}
if(directions & LT)
{
temp = rand();
if(temp > max)
{
max = temp;
direction = LT;
back = RT;
temprow = row;
tempcol = col - 1;
}
}
if(directions & RT)
{
temp = rand();
if(temp > max)
{
max = temp;
direction = RT;
back = LT;
temprow = row;
tempcol = col + 1;
}
}
maze[row][col] = direction;
maze[temprow][tempcol] += back;
}
void writemaze(int maze[12][12])
{
int i, j;
puts("#####################");
for(i=1 ; i<11 ; ++i)
{
putchar('#');
for(j=1 ; j<11 ; ++j)
{
putchar('.');
if(maze[i][j] & RT)
putchar('.');
else putchar('#');
}
putchar('\n');
for(j=1 ; j<11 ; ++j)
{
putchar('#');
if(maze[i][j] & DN)
putchar('.');
else putchar('#');
}
puts("#");
}
}
موفق باشید
هرکس میره دانشگاه یا میخواد برنامه نویسی یاد بگیره یکی از Exercise های کتاب یا استاد سوال Maze هست .حل کردن و ساختن .
این شاید خوب بهینه و کامل نباشه ولی به عنوان یه راهنمایی فک کنم کافیه
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define UP 1
#define DN 2
#define LT 4
#define RT 8
int addelem(int, int [12][12], int *, int, int);
void openwall(int [12][12], int, int);
void writemaze(int [12][12]);
void main(void)
{
int i, j, base;
int search[150], array[12][12];
for(i=1 ; i<11 ; ++i)
{
array[i][0] = -1;
array[i][11] = -1;
array[0][i] = -1;
array[11][i] = -1;
for(j=1 ; j<11 ; ++j)
array[i][j] = 0;
}
srand((int)time(NULL));
i = rand() % 10 + 1;
j = rand() % 10 + 1;
base = addelem(0, array, search, i, j);
array[i][j] = RT + RT; /* Not a valid value */
while(0 < base)
{
i = rand() % base;
j = search[i];
search[i] = search[--base];
i = j % 100;
j /= 100;
openwall(array, i, j);
base = addelem(base, array, search, i, j);
}
writemaze(array);
}
int addelem(int base, int maze[12][12], int *search, int row, int col)
{
if(0 == maze[row-1][col])
{
search[base++] = row + col * 100 - 1;
maze[row-1][col] = -DN;
}
else if(0 > maze[row-1][col])
maze[row-1][col] -= DN;
if(0 == maze[row+1][col])
{
search[base++] = row + col * 100 + 1;
maze[row+1][col] = -UP;
}
else if(0 > maze[row+1][col])
maze[row+1][col] -= UP;
if(0 == maze[row][col-1])
{
search[base++] = row + col * 100 - 100;
maze[row][col-1] = -RT;
}
else if(0 > maze[row][col-1])
maze[row][col-1] -= RT;
if(0 == maze[row][col+1])
{
search[base++] = row + col * 100 + 100;
maze[row][col+1] = -LT;
}
else if(0 > maze[row][col+1])
maze[row][col+1] -= LT;
return base;
}
void openwall(int maze[12][12], int row, int col)
{
int directions, max, direction, temprow, tempcol, temp, back;
directions = -maze[row][col];
max = 0;
if(directions & UP)
{
temp = rand();
if(temp > max)
{
max = temp;
direction = UP;
back = DN;
temprow = row - 1;
tempcol = col;
}
}
if(directions & DN)
{
temp = rand();
if(temp > max)
{
max = temp;
direction = DN;
back = UP;
temprow = row + 1;
tempcol = col;
}
}
if(directions & LT)
{
temp = rand();
if(temp > max)
{
max = temp;
direction = LT;
back = RT;
temprow = row;
tempcol = col - 1;
}
}
if(directions & RT)
{
temp = rand();
if(temp > max)
{
max = temp;
direction = RT;
back = LT;
temprow = row;
tempcol = col + 1;
}
}
maze[row][col] = direction;
maze[temprow][tempcol] += back;
}
void writemaze(int maze[12][12])
{
int i, j;
puts("#####################");
for(i=1 ; i<11 ; ++i)
{
putchar('#');
for(j=1 ; j<11 ; ++j)
{
putchar('.');
if(maze[i][j] & RT)
putchar('.');
else putchar('#');
}
putchar('\n');
for(j=1 ; j<11 ; ++j)
{
putchar('#');
if(maze[i][j] & DN)
putchar('.');
else putchar('#');
}
puts("#");
}
}
موفق باشید