/* 左手法による探索をするマウス */ /* #define MOUSESIM enum Action { Step, TurnLeft, TurnRight, TurnBack, End }; */ /* int senseForward(); int senseLeft(); int senseRight(); void MousePuts(char *message); */ /* マウスの把握している自分の現在位置と方向 */ int curx, cury, curdir ; /* マウスの記憶しているマップ */ int myMap[16][16]; // bit 0 : その区画の西に壁があると1 // bit 1 : その区画の南に壁があると1 // bit 2 : その区画に立ち寄ったことがあると1 // bit 3 : 経路探索で見つかった、たどるべき道を示すパン屑 int myMode ; int rotx(int dx, int dy) { switch (curdir) { case 0: return dx; case 1: return -dy; case 2: return -dx; case 3: return dy; } } int roty(int dx, int dy) { switch (curdir) { case 0: return dy; case 1: return dx; case 2: return -dy; case 3: return -dx; } } void setWall(int dir) { int direction = (curdir+dir) % 4; switch (direction) { case 0: if (curx < 15) { myMap[curx+1][cury] |= 2; } break; case 1: if (cury < 15) { myMap[curx][cury+1] |= 1; } break; case 2: myMap[curx ][cury] |= 2 ; break; case 3: myMap[curx ][cury] |= 1 ; break; } } /* 等高線法による、未到達区画への経路の発見 */ int routeMap[16][16]; int findUnvisited() { int i,j; for (i=0;i<16;i++) { for (j=0;j<16;j++) { routeMap[i][j] = 255; myMap[i][j] &= 0xf7; // ~8 で狂うのはCINTのバグだろ。 } } // こういう計算、memfill とか union map[256] でやった方がちょっと速い。 // 1.現在位置からの距離を書き込んでいく。未到達区画に達したら完了。 routeMap[curx][cury] = 0; int stepflag = 1; // スキャンして1区画も進展しなかったら行き詰まり。 int fx,fy; // 発見した未到達区画 int v,v1; v = 0; v1 = 1; while (stepflag) { stepflag = 0; for (i=0;i<16;i++) { for (j=0;j<16;j++) { if (routeMap[i][j] == v) { // N if ((i<15) && (v