dポイントプレゼントキャンペーン実施中!

1) 駒の位置を(列,行)と表すとき,(i,j)と(i’,j’)の位置に置かれた2つの駒が互いに斜めの利き筋に入っているかどうかを判定するための条件を考える
(2) 上の条件をプログラムで記述し,すべての駒の組が利き筋に入っていない場合にそのときの置き方を表す順列を表示したい(下記のプログラムの赤字の部分を変更する)。
(3) 出力方法を工夫して結果を分かりやすく表示するプログラムを作成したい。

この条件のプログラムを満たしたプログラムに修正お願いします
(参考)0~nのn+1個の数を全部使ってできる順列をすべて生成するプログラム
#include <stdio.h>
#include <math.h>

int a[ 10 ]; // 順列を格納する配列(最大0~9の順列を格納できる)
int cnt = 0; // 順列の個数

// k番目からn番目までの順列を生成
void perm( int k, int n )
{
int i, j, l;

for( i = 0; i <= n; i++ ){ // k番目の候補
for( j = 0; j < k; j++ ){ // k-1番目までに候補と等しいものがあるか
if( a[ j ] == i ){ // あればこの先を調べる必要はない
break;
}
}
if( j == k ){ // k-1番目までに候補と等しいものがなかった場合
a[ k ] = i; // k番目をその候補で決定
if( k < n ){ // kがn未満ならばk+1番目からn番目の順列を生成
perm( k + 1, n );
}
else{ // それ以外(kとnが等しいとき)は順列が1つ完成で出力
printf( "%6d : ", ++cnt );/*赤文字部
for( l = 0; l <= n; l++ ){
printf( "%d ", a[ l ] );
}
printf( "\n" );*/
}
}
}
}

int main()
{
int n;

printf( "0~nからなる順列をすべて列挙します。\n" );
printf( "nを入力してください:" );
scanf( "%d", &n );
perm( 0, n ); // 0番目からn番目の順列を生成する
}

A 回答 (1件)

(1) 二つの座標を通る線の傾きが1または-1ならば、利き筋にはいっている


  2つの座標を引数にして、1(入っている)または0(入っていない)を返す関数をつくる
  (傾きはどうやって計算するのか? math.hの関数を使用する)

(2) 配列a[0] ~ a[n]までの各座標(i, a[i])の全て組み合わせを(1)の関数でチェックして
  一つでも利き筋に入っていれば1, そうでなければ0を返す関数をつくる
  (forの二重ループ, if, breakを使用)

  関数permの赤字部分を、作成した関数の返り値が0なら表示するように変更する

(3) 「結果を分かりやすく表示」とはどういうことなのか不明なので回答不能


課題の丸投げはまともな回答がつきません。
考え方を示したのでご自身でプログラムしてみて下さい。
提示されている関数permの内容が理解できているレベルであれば、簡単なはずです。
    • good
    • 2

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!