解老數走迷宮
舊筆記
特點:
不會走己經走過的路,除非是遇到死路,才會往回走.....
#include <stdlib.h>
#include <stdio.h>
#include<time.h>
int map[10][10]={{1,1,0,0,0,0,0,0,0,0}, /*地圖*/
{0,1,0,1,0,0,0,0,0,0},
{0,1,1,1,0,0,0,0,0,0},
{0,0,1,0,0,0,0,0,0,0},
{0,0,1,1,1,1,0,1,0,0},
{0,0,0,0,0,1,1,1,0,0},
{0,0,0,1,1,1,0,0,0,0},
{0,0,0,1,0,1,1,1,0,0},
{0,1,1,1,0,1,0,1,1,1},
{0,0,0,1,1,1,0,0,0,1}
};
void move(int r,int w){ /*判斷要如何走的函數*/
int rr,ww,s;
while(map[9][9]!=2){ /*判斷是否走到出口*/
rr=r;
ww=w;
s=4*rand()/RAND_MAX; /*用亂數取方向0:上 1:右 2:下 3:左*/
switch(s){ /*取完亂數將記錄r或W的數先加減*/
case 0:
rr--; /*0:上 所以是rr--,ww*/
break;
case 1:
ww++; /*1:右 所以是rr,ww++*/
break;
case 2:
rr++; /*2:下 所以是rr++,ww*/
break;
case 3:
ww--; /*3:左 所以是rr,ww--*/
break;
}
if(map[r-1][w]!=1 && map[r][w+1]!=1 && map[r+1][w]!=1 && map[r][w-1]!=1){ /*判斷是否己經沒路,是的話就回到上一步(回到上個遞迴)*/
return;
}
else if(rr>=0 && ww>=0 && rr<=9 && ww<=9){ /*判斷亂數取完方向是否在地圖內*/
if(map[rr][ww]==1){ /*判斷亂數取完方向,此方向是否為1,若不是則跳回到while再取,反之就將此步變2再到下個遞迴*/
map[rr][ww]=2;
r=rr;
w=ww;
move(r,w);
}
else{
continue;
}
}
}
return;
}
void prt(){ /*列印地圖*/
int i,j;
for(i=0;i<10;i++){
for(j=0;j<10;j++){
printf("%d",map[j]);
}
printf("\n");
}
}
int main()
{
int r=0,w=0;
srand(time(NULL)); /*取亂數時要先有這行,這樣取出來的亂數才不會都一樣*/
printf("原始地圖:\n");
prt();
move(r,w);
printf("走完後地圖:\n");
prt();
system("PAUSE");
return 0;
}