• ベストアンサー

騎士巡歴の問題 C言語

騎士の巡歴プログラム(5x5)をC言語で作成したいのですが どなたかわかる方いますか? OS: (Windows XP) コンパイラ名とバージョン: (Visual C++ 2008) チェスの駒、ナイト(■)を移動させて全てのマスとまるプログラムです。 □□□□□ □□□□□ □□□□□ ■□□□□ この状態からナイトが動けるのは、 □□□□□ □□□□□ □A □□□ □□B □□ ■□□□□ A(1,2)とB(2,3)です。 一度この状態のAとBの位置を黒く塗ります。 □□□□□ □□□□□ □■□□□ □□■□□ ■□□□□ 次にナイトが動けるのは、 A □B □□ □G □C □ F ■□□H □□■D □ ■□E □I 元Aからは、A(0,0)とB(2,0)とC(3,1)とD(3,3)とE(2,4)と最初のK(0,4)に、 元Bからは、F(0,2)とG(1,1)とC(3,1)とH(4,2)とI(4,4)と最初のK(0,4)に、移動できます。 これを続けて全ての□に止まるのが騎士の巡歴プログラムだと仮定します。 上記の条件でプログラムを作りたいのですが、どなたかソースをお分かりになる方いませんか?

質問者が選んだベストアンサー

  • ベストアンサー
回答No.3

http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1335747848 で回答を頂いたものの、未解決なのですか? http://blogs.yahoo.co.jp/mki_ltd/27633908.html に回答プラグラムが掲載されています。そのうちの2カ所を、↓のように修正すればOKです。 knighttour(x + dx[i], y + dy[i]); /* 道順の先を辿る */   ↓↓↓ 修正 ↓↓↓ knighttour(x - dx[i], y + dy[i]); /* 道順の先を辿る */ /* board[2][2]が最初の地点 */ knighttour(2, 2);   ↓↓↓ 修正 ↓↓↓ knighttour(6, 2);

12172777
質問者

お礼

わざわざありがとうございます。 何とか先ほど無事解決できました。

その他の回答 (2)

  • edomin7777
  • ベストアンサー率40% (711/1750)
回答No.2
12172777
質問者

お礼

ありがとうございます。 参考にさせていただきます。

  • asuncion
  • ベストアンサー率33% (2126/6286)
回答No.1

>プログラムを作りたいのですが、どなたかソースをお分かりになる方いませんか? この文の意味がわかりません。 ご自分で作りたいのですよね?それなのに、どうして他人から ソースを得ようとするのでしょうか? プログラムを動かしたいのですが、どなたかソースをお分かりになる方いませんか? という質問ならば、まだわかります。

12172777
質問者

補足

>プログラムを動かしたいのですが、どなたかソースをお分かりになる方いませんか? 当方、プログラミング初心者で参考にしたいのでモデルとなるソースがほしいという意味で質問致しました。 わかりにくくて申し訳ない。。。

関連するQ&A

  • C言語の配列の使い方について質問です。

    以下のプログラムを配列を使って見やすくしたいのですが、どのように作ったら良いでしょうか? 宜しくお願いします。 #include<stdio.h> int main(void) { int a, b, c, d, e, f, g, h, i, j, k, l, m ,n, o; /*5段目の処理*/ for(a = 1; a <= 15; a++) { for(b = 1; b <= 15; b++) { if(a == b) continue; for(c = 1; c <= 15; c++) { if(a == c || b == c) continue; for(d = 1; d <= 15; d++) { if(a == d || b == d || c == d) continue; for(e = 1; e <= 15; e++) { if(a == e || b == e || c == e || d == e) continue; // printf("%d %d %d %d %d\n", a, b, c, d, e); ////4段目//// if(a>b){ f=a-b; } else if(a<b){ f=b-a; } if(b>c){ g=b-c; } else if(b<c){ g=c-b; } if(c>d){ h=c-d; } else if(c<d){ h=d-c; } if(d>e){ i=d-e; } else if(e<d){ i=e-d; } // printf(" %d %d %d %d \n", f, g, h, i); /////3段目//// if(f>g){ j=f-g; } else if(f<g){ j=g-f; } if(g>h){ k=g-h; } else if(g<h){ k=h-g; } if(h>i){ l=h-i; } else if(h<i){ l=i-h; } // printf(" %d %d %d \n", j, k, l); /////2段目//// if(j>k){ m=j-k; } else if(j<k){ m=k-j; } if(k>l){ n=k-l; } else if(k<l){ n=l-k; } // printf(" %d %d \n", m, n); /////三段目///// if(m>n){ o=m-n; } else if(m<n){ o=n-m; } // printf(" %d \n", o); if(a != b != c != d != e != f != g != h != i != j != k != l != m != n != o){ printf("%d %d %d %d %d\n", a, b, c, d, e); printf(" %d %d %d %d \n", f, g, h, i); printf(" %d %d %d \n", j, k, l); printf(" %d %d \n", m, n); printf(" %d \n", o); } } } } } } }

  • C言語

    main() { int a = 5,b=2,e,f,g=3,i; double c,d,h=2.0; c = a/b; printf("c = %f\n",c); d = a/h; printf("d=%f\n",d); e = a++; f = ++b; g+= 4; i= ++a + b; printf(" a = %d\n",a); printf(" b = %d\n"b); printf(" e = %d\n"e); printf(" f = %d\n"f); printf(" g = %d\n"g); printf(" i = %d\n" i); 答え a=7,b=3,c=2.0,d=2.5,e=5,f=3,g=7,i=10 この問題のa,b,iがどうやってこの値になるのかがわかりません解説お願いします。

  • C言語について

    「キーボードから10個の実数を入力し、それらの平均を求めるプログラムを作れ。」という問題で私は、 #include <stdio.h> void main(void) { float A; float a,b,c,d,e,f,g,h,i,j; printf("実数を入力してください:"); scanf("%f",&a); scanf("%f",&b); scanf("%f",&c); scanf("%f",&d); scanf("%f",&e); scanf("%f",&f); scanf("%f",&g); scanf("%f",&h); scanf("%f",&i); scanf("%f",&j); A=(a+b+c+d+e+f+g+h+i+j)/10; printf("平均は%fです.\n",A); } と考えたのですが、もっとすっきりとしたプログラムはないのでしょうか?もっとシンプルにしたいのです。教えて下さい。よろしくお願いします。

  • C言語について

    C言語でif文の条件指定の際、a > b && c > dとe > f && g > hのどちらかが成立すれば真という条件を書きたい場合、a > b && c > d || e > f && g > hという文では間違いですよね? どのように表記すればいいでしょうか? 解答よろしくお願いします。

  • 円周率を求めるC言語のプログラム

    int a=10000,b,c=8400,d,e,f[8401],g;main(){for(;b-c;)f[b++]=a/5;for(;d=0,g=c*2;c-=14,printf("%.4d",e+d/a),e=d%a)for(b=c;d+=f[b]*a,f[b]=d%--g,d/=g--,--b;d*=b); というのが本(「π魅惑の数」)に載っていたので #include <stdio.h> int main(void){ int a=10000,b,c=8400,d,e,f[8401],g; for(;b-c;)f[b++]=a/5; for(;d=0,g=c*2;c-=14,printf("%.4d",e+d/a),e=d%a) for(b=c;d+=f[b]*a,f[b]=d%--g,d/=g--,--b;d*=b); return 0; } としたのですが 円周率を表示してくれません。 (b=0にすると一応は出てくるのですが微妙に間違ってます(よく分からないですけどそのくらいの誤差のあるプログラムなのでしょうか?))

  • 線形代数の問題?

    線形代数の問題だと思うのですが、9個の未知数がa b c d e f g h i  があって、  a+b+c=2 d+e+f=2 g+h+i=2 a+d+g=2 b+e+h=2 c+f+i=2 を満たしているとします。  行列で書くと、 「1 1 1 0 0 0 0 0 0 | |0 0 0 1 1 1 0 0 0| |0 0 0 0 0 0 1 1 1| |1 0 0 1 0 0 1 0 0|=A |0 1 0 0 1 0 0 1 0| |0 0 1 0 0 1 0 0 1 」 x=(a b c d e f g h i) c=(2 2 2 2 2 2 2 2 2) として、A(xの転置)=(cの転置) と書けます。 a~iは0か1として、解が何個あるのか調べたいのですがどのように考えたらよいのでしょうか。

  • C言語の演算子!=の使い方で質問です。

    if(a != b != c != d != e != f != g != h != i != j != k != l != m != n != o) 上記は間違いです。 変数a~nが同じじゃなければとしたいのです。 ご指導お願いします。

  • c言語について

    このプログラムであと2行削れるとこがあるそうです。 どこがけずれますか? #include <stdio.h> #include <math.h> #define f(x) ((x)+(log(x))) #define EPS 1e-8 main( ) { double a, b, c, fa, fb, fc; int i=1; printf("input a and b: "); /*区間[a,b]の入力, a<b とする*/ scanf("%lf%lf", &a, &b); fa = f(a); fb = f(b); do { c = (a+b) / 2; /*cの値の更新*/ fc = f(c); printf(" %2d : a = %f, b = %f, c = %f, fc = %f\n", i, a, b, c, fc); if (fb*fc < 0){ a = c; fa = fc; } if (fa*fc < 0) { b = c; fb = fc; } if(fabs(fc) < EPS ) break; }while(++i<100); /*iが100以上になったら繰り返し終了*/ }

  • VBA

    1 a;b;c;d; 2 e;f;g;h; 3 i;j;k;l; をVBAで   1 a;   2 e;   3 i;   1 b;   2 f;    3 j;   1 c;   2 g;   3 k;   1 d;   2 h;   3 l; としたいのですが、どうしたらいいですか?

  • 配列の要素を任意の数で割って、割り振る方法

    $abc = array("A", "B", "C", "D", "E", "F", "G", "H", "I"); 上記のような配列があったとします。 これを任意の数で割って、割り振っていきたいのですが、例えば7で割ったとしたら、 1. A, B 2. C, D 3. E 4. F 5. G 6. H 7. I という風に、割り振りたいのですが、どのようにすれば、こういったことがPHPのプログラムで実現できるか教えてください。 もしくは、 1. A, H 2. B, I 3. C 4. D 5. E 6. F 7. G という割り振り方でも大丈夫です。

    • ベストアンサー
    • PHP

専門家に質問してみよう