騎士巡回

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
wow

騎士巡回

#1

投稿記事 by wow » 15年前

騎士巡回のプログラムを学んでいる物です。
下のプログラムによって経路数と一番内側のif文の評価回数を表示したいのですが,うまくできません><
a,b,cを使って考えたのですが、どのようにしたらよろしいでしょうか??
教えてください><

#include<stdio.h>
#define M 8 //板の大きさ
#define N 8
int array[N][N]; //到達を判別
int move[M][2]={{2,1},{1,2},{-1,2},{-2,1},{-2,-1},{1,-2},{2,-1}};
int n_a=0;

void try(int x,int y,int a_move){ //x,yからスタートする
int n,nx,ny,i;
long int a,b,c; //カウント変数
a=0;
b=0;
for(i=0;i<M;i++){
nx=x+move[0];
ny=y+move[1];
if(nx<0 || nx>=N) continue; //板内にあるか判断
if(ny<0 || ny>=N) continue; //板内にあるか判断
if(array[nx][ny]==0){
array[nx][ny]=a_move;
if(a_move==n*n){
if(c<100000000000000) c++;
if(b<100000){
c=0;
b++;
}
else{
c=0;
b=0;
a++;
}
printf(" %d %d %d\n",a,b,c); //
}
else{
try(nx,ny,a_move+1); //バックトラック
}
array[nx][ny]=0;
}
}
}

int main(){
int i,j;
for(i=0;i<N;i++){
for(i=0;i<N;i++){
array[j]=0;
array[0][0]=1;
try(0,0,2); //0,0からスタート
return 0;
}
}
}

box

Re:騎士巡回

#2

投稿記事 by box » 15年前

さしあたり、「うまくできない」と判断した根拠を示してください。

wow

Re:騎士巡回

#3

投稿記事 by wow » 15年前

int型を超える桁数に対して、プログラム上どのように工夫して桁あふれがないように、表示できるでしょうか??
全解探索だと8の63乗ほど数値が大きくなってしまうため、それをa,b,cを使ってあらわそうと思ったのですが、どのようにしたらよろしいでしょうか??
お願いします。

box

Re:騎士巡回

#4

投稿記事 by box » 15年前

a, b, cの意味合いは何ですか?
ご自分で定義された変数ですから、何のために使っているか
日本語で説明できるはずですね。

たいちう

Re:騎士巡回

#5

投稿記事 by たいちう » 15年前

> 騎士巡回のプログラムを学んでいる物です。

質問はif文の評価回数ですが、騎士巡回プログラムの完成が最終目標ですよね?
これはどんなルールですか?
チェス盤をナイトが巡回するというのは分かるけど、
巡回ルートを1つ見つければ良い?全巡回ルートを見つけたい?

上記の目的に対して、wowさんはどのような方針(アルゴリズム)の
プログラムを作ろうとしているのですか?
if文の評価回数を知りたいのは何故?

閉鎖

“C言語何でも質問掲示板” へ戻る