-------------------------------------------------------------------------------------------
Flash版老鼠走迷宮:
-------------------------------------------------------------------------------------------
// BCB 程式碼範例
int u, v, i, j;
position step;
int mark[200][200];
boolean found = false;
move[N].dx = -1; move[N].dy = 0;
move[NE].dx = -1; move[NE].dy = 1;
move[E].dx = 0; move[E].dy = 1;
move[SE].dx = 1; move[SE].dy = 1;
move[S].dx = 1; move[S].dy = 0;
move[SW].dx = 1; move[SW].dy = -1;
move[W].dx = 0; move[W].dy = -1;
move[NW].dx = -1; move[NW].dy = -1;
Memo1->Lines->Add("m="+IntToStr(m)+" p="+IntToStr(p));
// Memo1->Lines->Add(found);
for (i=1; i<=m; i++)
{ for (j=1; j<=p; j++)
{ mark[i][j] = maze[i][j];
}
}
for (i=0; i<=m; i++) { mark[i][0] = 1; mark[i][p+1] = 1; }
for (j=0; i<=p; i++) { mark[0][j] = 1; mark[m+1][j] = 1; }
step.x = 1;
step.y = 1;
step.dir = E; // (i,j,dir)=(1,1,E)
push(step);
while (top != -1)
{ step = pop();
while ((step.dir <= NW) && (!found))
{ u = step.x+move[step.dir].dx;
v = step.y+move[step.dir].dy;
int x = step.dir;
Memo1->Lines->Add(".. (u,v,dir)="+
IntToStr(u)+","+IntToStr(v)+","+IntToStr(x));
//str = ;
Memo1->Lines->Add("...come:"+IntToStr(u)+","+
IntToStr(v)+","+IntToStr(x));
// (u,v) = 自(i,j)欲嘗試的下一步座標
if ((u == m) && (v == p))
{ found = true; //成功找到出口,輸出路徑,可以停止
str = "("+IntToStr(m)+","+IntToStr(p)+")";
StringGrid1->Cells[p][m] = "&";
str = "("+IntToStr(step.x)+","+IntToStr(step.y)+","+IntToStr(x)+")-->"+str;
StringGrid1->Cells[step.y][step.x] = "->";
while (top != -1)
{ step = pop();
int x = step.dir;
str = "("+IntToStr(step.x)+","+IntToStr(step.y)+","+IntToStr(x)+")-->"+str;
StringGrid1->Cells[step.y][step.x] = "->";
}
Memo1->Lines->Add(str);
}
else if ((maze[u][v]==0) && (mark[u][v]==0))
//(u,v)可以走,且不曾走過
{ mark[u][v] = 1;
StringGrid1->Cells[v][u] = "*";
step.dir = step.dir+1; //?
push(step);
step.x = u; step.y = v; step.dir = N;
}
else step.dir += 1;
}
}
// Visual C++ 程式碼範例
step.x = 1;
step.y = 1;
step.dir = E; // (i,j,dir)=(1,1,E)
push(step);
while (top != -1)
{ step = pop();
while ((step.dir <= NW) && (!found))
{ u = step.x+move[step.dir].dx;
v = step.y+move[step.dir].dy;
int x = step.dir;
listBox1->Items->Add("(u,v,dir) = "+u+","+v+","+x);
listBox1->Items->Add("come: "+u+","+v+","+x);
// (u,v) = 自(i,j)欲嘗試的下一步座標
if ((u == m) && (v == p))
{ found = true; //成功找到出口,輸出路徑,可以停止 }
str = "("+m.ToString()+","+p.ToString()+")";
dataGridView1->Rows[m]->Cells[p]->Value = "&";
str = "("+step.x.ToString()+","+step.y.ToString()+
","+x.ToString()+")-->"+str;
dataGridView1->Rows[step.x]->Cells[step.y]->Value = "->";
while (top != -1)
{ step = pop();
int x = step.dir;
str = "("+step.x.ToString()+","+step.y.ToString()+
","+x.ToString()+")-->"+str;
dataGridView1->Rows[step.x]->Cells[step.y]->Value = "->";
}
listBox1->Items->Add(str);
}
else if ((maze[u][v]==0) && (mark[u][v]==0))
//(u,v)可以走,且不曾走過
{ mark[u][v] = 1;
dataGridView1->Rows[u]->Cells[v]->Value = "*";
step.dir = (directions)(step.dir+1);
push(step);
step.x = u; step.y = v; step.dir = N;
}
else
step.dir = (directions)(step.dir+1);
}
}