いきなりですが、最近二角取り(四川省)をC言語を用いて作っています。
しかし、牌と牌の最短経路を算出するのにダイクストラ法を用いたところうまく動きません。
ある程度まで答えを求めてくれているようなのですが、答えをすべて出す前に終了してしまっているようです。
その結果、二角取りの二回まで曲がれる、という部分を調べる部分で答えが出ていないため
最終的にアクセス違反が起こり、プログラムが強制終了してしまいます。
具体的なコードは以下のような感じです。
#define X_SIZE 20
#define Y _SIZE 13
#define MAX_SIZE (X_SIZE * Y_SIZE)
#define WALL 9
int dn[4] = { -20, 1, 20, -1 };
int visit[MAX_SIZE], cost[MAX_SIZE], prev[MAX_SIZE];
/*
data[MAX_SIZE].stage = {
9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,
9,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,9,
9,1,5,5,5,5,5,5,5,1,1,5,5,5,5,5,5,5,1,9,
9,1,5,5,5,5,5,5,5,1,1,5,5,5,5,5,5,5,1,9,
9,1,5,5,5,5,5,5,5,1,1,5,5,5,5,5,5,5,1,9,
9,1,5,5,5,5,5,5,5,1,1,5,5,5,5,5,5,5,1,9,
9,1,5,5,5,5,5,5,5,1,1,5,5,5,5,5,5,5,1,9,
9,1,5,5,5,5,5,5,5,1,1,5,5,5,5,5,5,5,1,9,
9,1,5,5,5,5,5,5,5,1,1,5,5,5,5,5,5,5,1,9,
9,1,5,5,5,5,5,5,5,1,1,5,5,5,5,5,5,5,1,9,
9,1,5,5,5,5,5,5,5,1,1,5,5,5,5,5,5,5,1,9,
9,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,9,
9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9
};
*/
void Search(int start)
{
int i,min,next,dist;
cost[start] = 0;
prev[start] = start;
do{
min = MAX_VALUE;
next = -1;
visit[start] = TRUE;
//頂点選択
for( i = 0; i < 4; i++ ){
if( visit[ start + dn[i] ] != FALSE || data[ start + dn[i] ].stage == WALL ) continue;
dist = cost[start] + data[ start + dn[i] ].stage;
if( cost[ start + dn[i] ] >= dist ){
cost[ start + dn[i] ] = dist;
prev[ start + dn[i] ] = start;
}
if( cost[ start + dn[i] ] < min ){
min = cost[ start + dn[i] ];
next = start + dn[i];
}
}
//ここまで
start = next;
}while( start != -1 );
return;
}
Windows7 32bit
VisualStudio2010 Professional
どなたかご助言いただけると助かります。というか助けてくださいお願いします。(TДT)