ページ 11

N-Queen

Posted: 2007年4月28日(土) 09:36
by 山田
#include <stdio.h>
#define N 20

void print_queens(int Q[N][N],int n)
{
  int i,j;
  for(i=0;i<n;i++){
    for(j=0;j<n;j++){
      if(Q[j]==1)
	printf("1");
      else if(Q[j]==0)
	printf("0"); 
    }
    printf("\n");	
  }
}

int check(int i,int j,int Q[N][N], int n){
  int I,J;
  int sum=0;
  
  /*yoko*/
  for(J=0;J<n;J++)
    if(Q[J]==1 && J!=j) 
      sum++;
  
  /*tate*/
  for(I=0;I<n;I++)
    if(Q[j]==1 && I!=i) 
      sum++;
  
  
  
  /*naname*/
  for(I=0;I<n;I++ ){
    for(J=0;J<n;J++){
      if(i+j==I+J && Q[J]==1 && J!=j && I!=i)
	sum++;
    }
  }
  
  for(I=0;I<n;I++ ){
    for(J=0;J<n;J++){    
      if(i-j==I-J && Q[J]==1 && J!=j && I!=i)
	sum++;
    }
  }
  return (sum);
}


int success(int Q[N][N],int n){ 
  int done=0; 
  int i,j; 
  for(i=0;i<n;i++){ 
    for(j=0;j<n;j++){ 
      if(check(i,j,Q,n)>0 && Q[j]) 
 	done==1; 
    } 
  }
  return(done); 
}



int main(void){
  int Q[N][N], P[N],n;
  int kensaku=1,flag;
  int i,j,I,J,a;
  
  printf("クイーンの数を入力しなさい\n");
  scanf("%d",&n);
  
  for(i=0;i<n;i++){
    for(j=0;j<n;j++){ 
      Q[j]=0;
      P=0;
    }
  }
  
  for(i=0;i<n;i++){
    for(j=P;j<n;j++){  
      if( check(i,j,Q,n)==0){
	Q[i][j]=1;
	P[i]=j;
	
	while( flag==1 ){
	  kensaku++;
	  flag=0;
	}break;
      }
      
      
      
    }  
    while( j==n ){
      P[i]=0; 
      j=P[--i]; 
      Q[i][j]=0;
      P[i]++;
      i--;
      flag=1;}
      

  }
  if(success(Q,n)==1);{
    print_queens(Q,n);
    printf("kaisu:%d\n",kensaku);     
  }
  return(0);
}
 
 


----------------------------------------------------------------------------------------------------
実際にこのプログラムで正常に結果は出るのですが、main文の中の二番目のwhile文のi++がプログラムの中でどのような意味を持つのかを教えてほしいです。
これだけがどうしてもわからず悩んでいます。
わかる方がいれば解答お願いします。

Re:N-Queen

Posted: 2007年4月29日(日) 02:02
by 管理人
こんにちは、おかしい箇所がパッと見2箇所あります。
for(i=0;i<n;i++){ 
    for(j=0;j<n;j++){ 
      if(check(i,j,Q,n)>0 && Q[j]) 
 	done==1; 
    } 
  }
 
 
このdoneの比較は代入の間違いですよね?


if(success(Q,n)==1);{


ここのif文は意味が有りません。
カッコの対応があっているのでコンパイルは通りますが、条件分岐しません。

どのような仕様のものなのか全然わからないので、はっきりいえませんが、
defineで定義されているN以上の数値が入力される事は絶対ないんですか?
もしあるなら用意した配列以上の要素をさす場合があるので、条件分岐させてN以上ならエラーとしましょう。

また、長いプログラムを貼り付けるときは、どんなアルゴリズムなのか、何をするプログラムなのか最低限書いてください。
お願いします。

またローカル変数a,j,Iは一度も使われていません。エラーや警告は出ないように修正してからアップしてください。