回答 受付中

[C言語] 巡回騎士問題

  • 困ってます
  • 質問No.9508353
  • 閲覧数69
  • ありがとう数0
  • 気になる数0
  • 回答数0

お礼率 47% (9/19)

下記のプログラムは5×5のマス巡回騎士問題で指定したマスから同じマスを通らずにすべてのマスを通る経路がある場合にその経路を表示するプログラムなのですが、try関数の最後のほうの

if(i == 25){nsols++; printout(); return 1;}
else{if(try(i + 1, u, v) == 1) return 1;}

を変更して全ての経路を表示させるようにせよ、という問題が解けません。どのように変更すればよいか教えてください。

#include <stdio.h>
#define N 5
#define STARTROW 0
#define STARTCOL 2

int board[N][N], moverow[8], movecol[8], nsols;
int try(int, int, int);
void printout();

main(){
int i, j;
nsols = 0;
moverow[0] = 2; movecol[0] = 1;
moverow[1] = 1; movecol[1] = 2;
moverow[2] = -1; movecol[2] = 2;
moverow[3] = -2; movecol[3] = 1;
moverow[4] = -2; movecol[4] = -1;
moverow[5] = -1; movecol[5] = -2;
moverow[6] = 1; movecol[6] = -2;
moverow[7] = 2; movecol[7] = -1;
for(i = 0; i < N; i++) for(j = 0; j < N; j++) board[i][j] = 0;
board[STARTROW][STARTCOL] = 1;
try(2, STARTROW, STARTCOL);
if(nsols == 0) puts("No solution.");
}

int try(int i, int x, int y){
int u, v, k;
for(k = 0; k < 8; k++){
u = x + moverow[k]; v = y + movecol[k];
if((u >= 0 && u <= 4) && (v >= 0 && v <= 4) && board[u][v] == 0){
board[u][v] = i;
if(i == 25){nsols++; printout(); return 1;}
else{if(try(i + 1, u, v) == 1) return 1;}
board[u][v] = 0;
}
}
return 0;
}

void printout(){
int i, j;
printf("-- result %d --\n", nsols);
for(i = 0; i < N; i++){
for(j = 0; j < N; j++) printf("%2d ", board[i][j]);
puts("");
}
}
通報する
  • 回答数0
現在回答を募集しています。
OKWAVE 20th Be MORE ありがとうをカタチに
このQ&Aで解決しましたか?
AIエージェント「あい」

こんにちは。AIエージェントの「あい」です。
あなたの悩みに、OKWAVE 3,500万件のQ&Aを分析して最適な回答をご提案します。

その他の関連するQ&A、テーマをキーワードで探す

キーワードでQ&A、テーマを検索する

特集


より良い社会へ。感謝経済プロジェクト始動

ピックアップ

ページ先頭へ