• ベストアンサー

8人の女王

nakashiの回答

  • ベストアンサー
  • nakashi
  • ベストアンサー率51% (21/41)
回答No.3

下記URLからの引用 /*********************************************************** nqueens.c -- N王妃の問題 ***********************************************************/ #include <stdio.h> #include <stdlib.h> #define N 8 /* N×N の盤面 */ int a[N], b[2 * N - 1], c[2 * N - 1], x[N]; void found(void) { int i, j; static solution = 0; printf("\n解 %d\n", ++solution); for (i = 0; i < N; i++) { for (j = 0; j < N; j++) if (x[i] == j) printf(" Q"); else printf(" ."); printf("\n"); } } void try(int i) { int j; for (j = 0; j < N; j++) if (a[j] && b[i + j] && c[i - j + N - 1]) { x[i] = j; if (i < N - 1) { a[j] = b[i + j] = c[i - j + N - 1] = 0; try(i + 1); a[j] = b[i + j] = c[i - j + N - 1] = 1; } else found(); } } int main() { int i; for (i = 0; i < N; i++) a[i] = 1; for (i = 0; i < 2 * N - 1; i++) b[i] = 1; for (i = 0; i < 2 * N - 1; i++) c[i] = 1; try(0); return EXIT_SUCCESS; }

参考URL:
ftp://ftp.matsusaka-u.ac.jp/pub/algorithms/src/nqueens.c

関連するQ&A

  • チェスのルール

    最近、ネットでチェスを始めました。 簡単なルールを覚えて、今はコンピューターと対戦して練習しているのですが 一つわからないことがあります。 ポーンは基本的に一マスずつ、または駒をとるときのみ斜め前に一マスずつ進めるはずなのに、 自分側のポーンの正面に、クイーンやビショップが来たときに取ろうとすると、 「無効な攻撃です」と出てきます。最初はバグなのかと思いましたが、何度もそういうことがありました。 自分が調べた時には見つけられなかったのですが、ポーンは取れる駒が限られる、等の ルールはあるのでしょうか? 知っている方教えてください(_ _*) 自分の説明がわかりにくかったらすみません

  • java

    java プログラミングで3×3の○×ゲームを作りたいのですが、エラーが出てしまいます。 どこに問題があるかわかりません。 教えていただけたら嬉しいです。 長くなってしまいますが、ご了承ください(コメント一部略)。 import java.io.*; // マスにの中身が // 空白: 0 // O : 1 // X : 2 class ox { // 勝敗の判定をするメソッド // 勝敗が付いていなければ0 を // O の勝ちなら1 を // X の勝ちなら2 を // 引き分けなら-1 を // それぞれ返す。 static int judge( int board[][] ) { int i, j, flag; for( i = 0; i < 3; ++i ) { flag = 1 | 2; for( j = 0; j < 3; ++j ) flag &= board[j][i]; // <=> flag = flag & board[j][i] if( flag != 0 ) return flag; } // 縦の列を調べる for( i = 0; i < 3; ++i ) { flag = 1 | 2; for( j = 0; j < 3; ++j ) flag &= board[i][j]; if( flag != 0 ) return flag; } // 左上→右下のナナメ flag = 1 | 2; for( j = 0; j < 3; ++j ) flag &= board[j][j]; if( flag != 0 ) return flag; // 右上→左下のナナメ flag = 1 | 2; for( j = 0; j < 3; ++j ) flag &= board[2-j][j]; if( flag != 0 ) return flag; // まだ置けるマスがあるかの判定 flag = 1; for( i = 0; i < 3; ++i ) { for( j = 0; j < 3; ++j ) flag *= board[i][j]; } // flag != 0 ってことは、置けるマスは無い→勝負が付いた // どちらかが勝ったのなら、上でreturn しているはず // ということで、引き分け if( flag != 0 ) return -1; // 何事もなければ、勝負続行 return 0; } // 番面の様子を表示するメソッド static void show ( int board[][] ) { String display = ""; String masu[] = { " ", "O", "X" }; int i; display += " |1|2|3\n"; for( i = 0; i < 3; ++i ) { display += "-+-+-+-\n"; display += (i+1) + "|" + masu[board[0][i]] + "|" + masu[board[1][i]] + "|" + masu[board[2} System.out.println( display ); } static int isreach( int three[], int turn ) { int i, result; // 各マスの値を2 乗して足し合わせる result = 0; for( i=0; i<3; ++i ) result += three[i]*three[i]; // リーチなら、下の条件を満たすはず if( result == 2*turn*turn ) { for( i=0; i<3; ++i ) if( three[i] == 0 ) break; return i; } return -1; } static int rival( int board[][] ) { int x,y,i,j,n; int three[] = new int[3]; // x, y が未定である事を明示 for( i=0; i<3; ++i ) { for( j=0; j<3; ++j ) three[j] = board[j][i]; 続きは追記にて

  • チェスのポーン(Pawn)の動きが、なかなか理解できません。

    チェスのポーン(Pawn)の動きが、なかなか理解できません。 将棋は知っているのですが、チェスのルールでポーン(Pawn)のすべての動きがわからず困っています。 理解できているのは以下の4つです。(kingが取られる条件は除外しています) 1) 前に進む位置に駒が無ければ前に1マス進むことができる。 2) 2段目にあるポーンは前の2マスに駒が無ければ2升前に進めることができる。 3) 1つ斜め前に敵ごまがあれば、斜めに進んで敵ごまを取ることができる。 4) 敵の一番奥にポーンが進むと、Q,R,B,Nの4つのうち、どれかに昇格する必要がある。 これに 2)と3)が混じった変な動きがあったような気がしますが チェスのルールに詳しい方教えてください。 また、チェスのルールは1つでしょうか?いつの時代から策定されたものが一般的なのでしょうか? 今回はポーンについて、すべて解決したいです。

  • x,y,z軸方向の単位ベクトルをi,j,kとする。

    x,y,z軸方向の単位ベクトルをi,j,kとする。 曲面F上の点の位置ベクトルrが r=xi+yj+(3-x^2-y^2)k・・・・・・(1) 曲面G上の点の位置ベクトルrが r=xi+yj+(2x^2+2y^2)k・・・・・・・・(2) で与えられている。 FとGで囲まれた領域をDとする。 (1)FとGの交線の円筒座標系(r,θ,z)における方程式を求めよ (2)Dの体積を求めよ (3)Dの表面積を求めよ (1)は交線なので、 (2)-(1)から、 (x^2+y^2-1)k=0 より、k=0 ?? x^2+y^2=1 ?? 方向ベクトルが i -y/x j = 1 k 0 となるから・・・・・・と考えたりしたんですが 円筒座標系に直すなどのつながりが全く分かりません。 (2)(3)など問題丸投げですいませんが、 よろしくお願いします。

  • 碁石を交点に置く理由-マスの中に置けば良いじゃん

    囲碁ってゲームあるじゃん。石を碁盤に打ってくんだけど、その打つ場所に違和感があります。 碁盤に線が縦横19本走ってて、その交点に石置いてるけど、何故でしょう?線に囲まれたマスの中に石を置けば良いじゃん。 将棋もチェスもオセロも、マスの中に駒置くよ。別に交点に置いても良くて、どちらでもルールの本質は保たれるけど、マスの中の方がシックリくるじゃん。囲碁もマスの中に碁石を置こうぜ。 石の色を赤青でやってる囲碁は見たことあります。んで、碁盤のサイズを19から変えてるのも見たことあります。 んが、マスの中に石置く囲碁は見たことないなー。

  • 一人用ボードゲーム

    小さい頃に遊んだボードゲームの名前が思い出せません。 誰かわかるかたいませんか?(; ゜ロ゜)      ●●●      ●●●      ●●● ●●●●●●●●● ●●●●○●●●● ●●●●●●●●●      ●●●      ●●●      ●●● 四方向に3マスx3マス(計9マス) 十字架クロスの形のマスになります。全合計で 四方向に9マスと真中に9マスで、45マスのボードになります。 こんな感じのマス目で、最後真中に一つになったらクリア。 遊び方は、駒を縦、横に一つだけ飛ばせて、飛び越えられた駒は 排除していって、最後にど真ん中に一つ残すゲームです。

  • チェスのポーンについて

    こんにちは チェス初心者の者です 気になることがあるので聞かせてください ポーンという将棋でいう歩の動きをする駒がありますよね  あれは何故、相手の駒をとる時、斜め方向にしか進むことが不可能なのでしょうか?あと、相手のポーンと対面すると動けなくなりますよね 相手が前にいるのに何故でしょうか? ルールだからと言われればそれまでですが、自分はルールができる時にはなにか参考にするものがあったと思います。ゲームのバランスを取るために調整したのかもしれませんが・・・ 回答お願いします

  • もう一度質問します。

     N×N-Queen問題を考えています。  チェスの駒の置き方を考えるもので、ある駒を置いた同じ縦列・横列・斜め列には駒が置けない条件下にある時、N×Nの盤の上にN個の駒を置くパターンは何個あるかというものです。  tree構造とbit操作を用いて考えたいのですがなかなかうまくいきません。  どうやったら解けるか、アルゴリズムでも下の私が考えたプログラムでもいいんでアドバイスください。 (4×4の場合) #include<stdio.h> #define BYTESIZE 8 void printbits(unsigned i); struct data { int basho; unsigned l1,l2,tate,x; }; int main(void) { unsigned m,l,hojo=0; int kenchi,i,j,k; struct data a[5]; for(i=0;i<=3;++i) { l=1<<i; hojo|=hojo|l; } a[0].l1=0; a[0].l2=0; a[0].tate=0; for(kenchi=0;kenchi<=3;) { for(i=1;i<=4;) { a[i].x=0; for(j=a[i].x;j<=3 && ((~l)&hojo)==0;++j) { m=1<<j; a[i].l1=((a[i-1].l1)<<1)&hojo; a[i].l2=((a[i-1].l2)>>1)&hojo; a[i].tate=(a[i-1].tate)|m; l=(a[i].l1)|(a[i].l2)|(a[i].tate); a[i].x=j+1; } if((~l)&hojo) { a[i].basho=j; a[i].l1=(a[i].l1)|m; a[i].l2=(a[i].l2)|m; ++i; if(i==5) {for(k=1;k<=4;++k) printf("%d ",a [k].basho);printf("\n");} } if(j==3)--i; if(i==0) kenchi++; } } } void printbits(unsigned intval) { unsigned i; for(i=0;i<BYTESIZE*sizeof(unsigned);++i) printf("%d",(intval<<i&1<<BYTESIZE*sizeof(unsigned)-1)?1:0); putchar('\n'); }  tateで駒があった列、l1で左にずらしたもの、l2で右にずらしたものを表しています(うまく説明出来なくすいません)。 参考URL:http://oshiete1.goo.ne.jp/kotaeru.php3?qid=329998

  • 配列

     Java初心者です。  RPGを作っているのですが、JPanelを継承したクラスのpaintComponentメソッドで、Stageをインスタンス化すると、 Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException というエラーメッセージが表示されてしまいます。  エラーが発生している行は、Stage.javaで、mass_x[0]に値を代入しているところです。DrowMapクラスを継承しているので、その辺でミスをしているのだと思いますが・・・。 ------------Stage.java public class Stage extends DrowMap{  //コンストラクタ  public Stage(){   super();   //////////変数に値を代入(一部略)   //マップに使用する画像   mapImage = "/material/mapchip/s10.png";   //マップの作成   map_arrangement = new int[][]{            {1,1,1,1},            {1,0,0,0},            {1,0,0,0},            {1,1,1,1} };   mass_x[0] = 1;//ここでNullPointerExceptionが発生   mass_y[0] = 1;      mass_x[1] = 1;   mass_y[1] = 16;  } } ----------DrowMap.java abstract public class DrowMap{  //////////変数宣言(一部略)    //読み込んだマップチップから切り取って表示するマス  public int[] mass_x;  public int[] mass_y;  //表示されるマップの配列  public int[][] map_arrangement;    //使用するマップ画像  public String mapImage;    //使用するマップ画像の縦横のサイズ(単位:ピクセル)  public int mapImageSize_yoko;  public int mapImageSize_tate;  /**マップを描画*/  public void drowMap(Graphics g){   mapchip = ImageIO.read(getClass().getResource(mapImage));//try~catchは略   for(int i=0; i < tate; i++){    //マップのX座標を初期化    map_x = 0;    //マップのY座標=フレームの上枠+行数×チップサイズ    map_y = frame_top_border + i * MAPCHIP_SIZE;      for(int j = 0; j < yoko; j++){     //マップのX座標=(回数-1)×マップチップの大きさ+フレームの左枠     map_x = j * MAPCHIP_SIZE + frame_border;       //次に表示するマスの、チップの番号=map_arrangement[i][j]の値     int chipnumber = map_arrangement[i][j];        //画像ファイルから切り取る部分の左上のx座標     source_x = (mass_x[chipnumber] - 1) * MAPCHIP_SOURCE_SIZE;         //画像ファイルから切り取る部分のy座標     source_y = mass_y[chipnumber] * MAPCHIP_SOURCE_SIZE;    }      //マップの描画    g.drawImage(mapchip,    map_x,map_y,    MAPCHIP_SIZE,MAPCHIP_SIZE,    source_x,source_y,    source_x+MAPCHIP_SOURCE_SIZE,    source_y+MAPCHIP_SOURCE_SIZE,    frame);   }  } }  色々と試してみたのですが、解決しません。お分かりになる方いらっしゃいましたら、教えていただけないでしょうか。

    • ベストアンサー
    • Java
  • マルバツゲームのプレーヤー交代の方法

    下記のソースのようにマルバツゲームを作っています。 setMaruBatuの$xに横位置、$yに縦位置を入れて、$kに入れる記号の種類を指定します。0が何もない状態で、1がマルで、2がバツです。 この際、プレーヤーを交互に入れ替えて、順番じゃない人は打てないようにしたいのですが、どういったプログラムを書けば、そういったことができますでしょうか。 よろしくお願いします。 <?php class MaruBatu{ private $board = array(); function __construct(){ for ($i=0; $i < 3; $i++) { for($j =0; $j < 3; $j++){ $this->board[$j][$i] = 0; } } } function setMaruBatu($x, $y, $k){ if($this->board[$x][$y] == 0){ $this->board[$x][$y] = $k; } } function showMaruBatu(){ for ($i=0; $i < 3; $i++) { for($j =0; $j < 3; $j++){ print $this->board[$j][$i]; } print '<br>'; } } } ?>

    • ベストアンサー
    • PHP