プログラミングの解説方法と要約

このQ&Aのポイント
  • プログラミングの解説方法と要約について教えてください。
  • プログラミングの解説方法のサンプルコードを提示しています。
  • プログラミングの解説に関する質問です。
回答を見る
  • ベストアンサー

下記プログラミングについて

下のプログラミングの解説ができる方がいましたら教えてください! どう頑張っても理解できなくて困っています;; もしかしたら間違っているところがあるかもしれませんが、よろしくお願いします。 ---------------------------------------------------------------- #include<stdio.h> #include<math.h> main() { int A,B,C,t,h,i,j,k; int sum_column,sum_row,diagonal1,diagonal2; int conf,diag,seed,max; int U[101][101],V[101][101]; int rand(); A=1,B=1,C=1; printf("Please define the pueen problem size(5-100).\n"); scanf("%d", &max); printf("Please input a seed(0-999).\n"); scanf("%d", &seed); for(i=1; i<=seed; i++){ U[1][1]=rand(); }; for(i=1; i<=max; i++){ for(j=1; j<=max; j++){ U[i][j] = -(abs(rand() % 8)); V[i][j]=0; }; };   /* Main program */ t=0; diag=1; while((diag>0)&&(t<500)){ diag=0; for(i=1; i<=max; i++){ for(j=1; j<=max; j++){ sum_column=0; sum_row=0; for(k=1; k<=max; k++){ sum_row=sum_row+V[i][k]; sum_column=sum_column+V[k][j]; } diagonal1=0; k=1; while(((j+k)<=max)&&((i-k)>=1)){ diagonal1=diagonal1+V[i-k][j+k]; k++; } k=1; while(((j-k)>=1)&&((i+k)<=max)){ diagonal1=diagonal1+V[i+k][j-k]; k++; } k=1; while(((j+k)<=max)&&((i+k)<=max)){ diagonal2=diagonal2+V[i+k][j+k]; k++; } k=1; while(((j-k)>=1)&&((i-k)>=1)){ diagonal2=diagonal2+V[i-k][j-k]; k++; } k=1; h=0; conf=1; if(sum_column == 0) h=1; if(sum_row == 0) h++; if((sum_column+sum_row==2) && (diagonal1<2) && (diagonal2<2)) conf=0; U[i][j]=U[i][j]-A*(sum_row+sum_column-2)-B*(diagonal1+diagonal2)+C*h; if(U[i][j]>8) U[i][j]=8; if(U[i][j]<-8) U[i][j]=-8; if(U[i][j]>0) V[i][j]=1; else V[i][j]=0; diag=diag+conf; }; }; t++; printf("t=%d\n", t); if((t % 15) < 5) C=4; else C=1; }; printf("the number of iteretion steps=%d\n", t); printf("\n"); for(i=1; i<=max; i++){ for(j=1; j<=max; j++){ if(j==max){ if(V[i][j]==1) printf("*\n"); else printf("-\n"); } else{ if(V[i][j]==1) printf("* "); else printf("- "); } } } }

  • kai35
  • お礼率100% (1/1)

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

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

>Please define the pueen problem とか書いてますが、タイポでしょう。 N Queensパズル、とか言われるパズルを解くプログラムじゃないんですか?多分。 次のサイトでも参照して下さい。 N Queens Problem: http://www.geocities.jp/m_hiroi/puzzle/nqueens.html

kai35
質問者

お礼

,ご回答ありがとうございます^^ サイトの掲示まで・・・本当にありがとうございます!! 参考にさせていただきます

関連するQ&A

  • 迷路作成のプログラミング

    迷路作成のプログラミングをC++で作ったのですが、エラーが出ます。 どのように直せば良いか教えてください。 エラー内容は 'randoomize': 識別子が見つかりませんでした。 16 進型定数には、少なくとも 1 桁の 16 進数が必要です。 'kbhit': 識別子が見つかりませんでした 'getch': 識別子が見つかりませんでした です、、お願いします。 #include <stdio.h> #include <stdlib.h> #include <time.h> #define YOKO_MAX 200 #define ESC '\xlb' int n; int map[YOKO_MAX],count[YOKO_MAX]; int rr() { return rand() % 10>3; } void tate() { int i,j,k; printf("■"); for (i=0; i<n-1;i++) if(map[i]!=map[i+1] && rr()) { k=map[i+1]; count[k]=0; for(j=0; j<n; j++) if(map[j]==k) { map[j]=map[i]; count[map[i]]++; } printf(" "); } else printf("■"); printf("■\n"); } void last_tate() { int i,j,k; printf("■"); for (i=0; i<n-1;i++) { if(map[i]==map[i+1]) printf("■"); else { k=map[i+1]; for (j=0; j<n; j++) if (map[j]==k) map[j]=map[i]; printf(" ",map[i]); } } printf("■\n"); } void yoko() { int i,j; for (i=0; i<n; i++) if (count[i]>1 && rr()) { printf("■■"); for(i=0; i<n; i++) { if (count[j]==0) { count[j]=1; count[map[i]]--; map[i]=j;break; } } } else { printf("■"); } printf("■\n"); } void enter() { int i,k; k=rand() % n; for (i=0; i<n; i++) if(i==k) { printf("■"); } else { printf("■■"); } printf("■\n"); } void initialize() { int i; for (i=0; i<n; i++) { map[i]=i; count[i]=1; } randoomize(); } int main() { printf("無限に大きな迷路\n"); do { printf("\n迷路の横幅(2~200)?"); scanf("%d",&n); } while (n<2||n>=YOKO_MAX); printf("\n ESCキーを押すと止まる。\n"); initialize(); enter(); do { tate(); yoko(); } while (!kbhit()||getch()!=ESC); last_tate(); enter(); }

  • C言語 プログラミング 行列演算

    下記のプログラムのおかしい点と解決法を教えてください。 コンパイルは通りますがうまく動きません。。 #include<stdio.h> #define MAX 500 int main(void){ int matrA[MAX][MAX],matrB[MAX][MAX],matrC[MAX][MAX],l,m,n,i,j,k; printf("lとmを入力してください:"); scanf("%d",&l); scanf("%d",&m); printf("行列Aを入力してください"); for(i=0;i<l;i++){ printf(">"); for(j=0;l<m;j++){ scanf("%d",&matrA[i][j]); } printf("\n"); } printf("nを入力してください(m = %d):",m); scanf("%d",&n); printf("行列Bを入力してください"); for(i=0;i<m;i++){ printf(">"); for(j=0;j<n;j++){ scanf("%d",&matrB[i][j]); } printf("\n"); } printf("C=\n"); for(i=0;i<l;i++){ for(j=0;j<n;j++){ for(k=0;k<m;k++){ matrC[i][j]+=matrA[i][k]*matrB[k][j]; } printf("%d",matrC[i][j]); } printf("\n"); } }

  • 大学のプログラミング課題について

    大学でプログラミングの課題が出たのですが、よくわからないので 詳しく教えてほしいです。 問題 99文字までの文字列を入力し,アルファベットの小文字は大文字に,アルファベットの大文字は小文字に,またアルファベット以外の文字はアスタリスク’*’に変換した文字列を出力するプログラムを作成せよ 実行結果は 99文字以下の文字列を入力してください.abcABC123sDFgh#"x32YY= 変換された文字列はABCabc***SdfGH**X**yy*です. というようになるはずなのですが、うまくいきません。 私が考えたのは #include <stdio.h> int main(void) { int i,j; char t[100],u; printf("99文字以下の文字列を入力してください"); scanf("%s",t); printf("変換された文字列は"); for(i=0;t[i]>0;i++); { } for(j=0;j<=i;j++); { if(t[j]>=65 && t[j]<=90) { u=t[j]+32; printf("%c",u); } else if(t[j]>=97 && t[j]<=122) { u=t[j]-32; printf("%c",u); } else { u='*'; printf("%c",u); } } printf("です\n"); } というものです。 ちなみに、他のライブラリ関数は使わないで作らないといけません。 どこが間違っているのかも含めて 教えていただけると嬉しいです。

  • プログラミングの配列で

    3*3の魔法陣を #include<stdio.h> int main(void) { int mg[3][3],i=1,j,no=3,k; j=(no+1)/2; mg[1][j]=1; for(k=2;k<=no*no;k++){ if(k%no==1) i++; else if(i==1){ i=no; j++; } else if(j==no){ i--; j=1; } else { i--; j++; } mg[i][j]=k; } for(i=1;i<=no;i++){ for(j=1;j<=no;j++) printf("%3d",mg[i][j]); printf("\n"); } return(0); } と作ってみたのですが、 if文やelse文内のi++やi=などを、 すべてfor文を使って表したい場合、 どのように変更したらいいですか? 他の部分(if文やelse文以外)をいじってもいいので、 教えてください。

  • ソースコードを簡潔に直したいのですが…

    有限積分法(参考 http://www.akita-nct.jp/yamamoto/study/thesis/2005/thesis_namekawa.pdf) を用いて、格子点 ( i, j, k )の磁場成分 Bx, By, Bz をその周辺を囲む電場成分 Ex, Ey, Ez で逐次計算するコードは次のようになります。 for ( i = 0; i < i_max; i++ ) {   for ( j = 0; j < j_max; j++ ) {     for ( k = 0; k < k_max; k++ ) {       Bx [ i ][ j ][ k ] = Ey [ i + 1 ][ j ][ k ] - Ey [ i + 1 ][ j ][ k + 1 ] + Ez [ i + 1 ][ j + 1 ][ k ] - Ez [ i + 1 ][ j ][ k ];       By [ i ][ j ][ k ] = Ez [ i ][ j + 1 ][ k ] - Ez [ i + 1 ][ j + 1 ][ k ] + Ex [ i ][ j + 1 ][ k + 1 ] - Ex [ i ][ j + 1 ][ k ];       Bz [ i ][ j ][ k ] = Ex [ i ][ j ][ k + 1 ] - Ex [ i ][ j + 1 ][ k + 1 ] + Ey [ i + 1 ][ j ][ k + 1 ] - Ey [ i ][ j ][ k + 1 ];     }   } } 電場成分の係数行列 C ( 0, 1, -1 のいずれかをもつ ) を求める必要が生じた、すなわち CCC  E  B CCC * E = B CCC  E  B のような行列計算に変更するため、次のように書き直しましたが係数行列 C を求める部分を簡潔にできませんでした。 for ( i = 0; i < i_max; i++ ) {   for ( j = 0; j < j_max; j++ ) {     for ( k = 0; k < k_max; k++ ) {       for ( x = 0; x < 3; x++ ) {         row = index ( x, i, j, k, i_max, j_max, k_max );         y = ( x + 1 ) % 3;         z = ( x + 2 ) % 3;         if ( x == 0 ) {           C[ row ][ index ( y, i + 1, j,   k,   i_max, j_max, k_max )] = 1;           C[ row ][ index ( y, i + 1, j,   k + 1, i_max, j_max, k_max )] = -1;           C[ row ][ index ( z, i + 1, j + 1, k,   i_max, j_max, k_max )] = 1;           C[ row ][ index ( z, i + 1, j,   k,   i_max, j_max, k_max )] = -1;         }         if ( x == 1 ) {           C[ row ][ index ( y, i,   j + 1, k,   i_max, j_max, k_max )] = 1;           C[ row ][ index ( y, i + 1, j + 1, k,   i_max, j_max, k_max )] = -1;           C[ row ][ index ( z, i,   j + 1, k + 1, i_max, j_max, k_max )] = 1;           C[ row ][ index ( z, i,   j + 1, k,   i_max, j_max, k_max )] = -1;         }         if ( x == 2 ) {           C[ row ][ index ( y, i,   j,   k + 1, i_max, j_max, k_max )] = 1;           C[ row ][ index ( y, i,   j + 1, k + 1, i_max, j_max, k_max )] = -1;           C[ row ][ index ( z, i + 1, j,   k + 1, i_max, j_max, k_max )] = 1;           C[ row ][ index ( z, i,   j,   k + 1, i_max, j_max, k_max )] = -1;         }       }     }   } } int index ( const int d, const int i, const int j, const int k, const int i_max, const int j_max, const int k_max ) {   return ( ( d * i_max + i ) * j_max + j ) * k_max + k; } void Solver ( const int i_max, const int j_max, const int k_max) {   int row, col,     cell_num = i_max * j_max * k_max;   for ( row = 0; row < cell_num; row++ ) {     for ( col = 0; col < cell_num; col++ ) {       B [ row ] += C [ row ][ col ] * E [ col ];     }   } } 添え字計算が多く、非常に複雑なソースコードですが、規則性があるので、 皆様の力をお借りして簡潔に表現したいです。 よろしくお願いします。

  • お願いします!!!プログラミングについて。

    お願いします!!!プログラミングについて。 次の文が実行されると何がどのようにプリントされるか。何もプリントされない時は「なし」と記せ。 また、途中に「ブランク」が入る場合は、”b”と記せ。 (1) printf("i=%d j=%lf\n", 1/2,1/3); (2) x = 0.5; y= 1e0/3e0; printf("x = %7.3f, y = %12.5e\n", x, y); */ (3) i = 2; j = 3; printf("%d", i==2); (4) int sum1(i){ int s = 0; return s += i; } int sum2(i){ static int s = 0; return s += i; } main(){ int s1, s2, i; for(i=1;i<=10;i++){ s1 =sum1(i); s2 = sum2(i);} printf("%d %d\n",s1,s2); } (5) int mtx[4][3] = {{1,2,3},{4,5,6},{7,8,9},{-1,-2,-3}}; int i,j,rtot,ctot[3]={0,0,0},stot=0; for(i=0,i<4,i++){ rtot = 0; for(j=0;j<3;j++){ rtot += mtx[i][j] ctot[j] += mtx[i][j]; stot += mtx[i][j]; printf("%3d ",mtx[i][j]); } printf(" %3d\n",rtot); } printf("\n"); for(j=0;j<3;j++) printf("%3d ",ctot[j]); printf(" %3d\n",rtot); この5問をプログラミングに詳しい方教えてください!切実です。。 一つだけでも構いません!よろしくお願いします。

  • お願いします!!!プログラミングについて。

    お願いします!!!プログラミングについて。 次の文が実行されると何がどのようにプリントされるか。何もプリントされない時は「なし」と記せ。 また、途中に「ブランク」が入る場合は、”b”と記せ。 (1) printf("i=%d j=%lf\n", 1/2,1/3); (2) x = 0.5; y= 1e0/3e0; printf("x = %7.3f, y = %12.5e\n", x, y); */ (3) i = 2; j = 3; printf("%d", i==2); (4) int sum1(i){ int s = 0; return s += i; } int sum2(i){ static int s = 0; return s += i; } main(){ int s1, s2, i; for(i=1;i<=10;i++){ s1 =sum1(i); s2 = sum2(i);} printf("%d %d\n",s1,s2); } (5) int mtx[4][3] = {{1,2,3},{4,5,6},{7,8,9},{-1,-2,-3}}; int i,j,rtot,ctot[3]={0,0,0},stot=0; for(i=0,i<4,i++){ rtot = 0; for(j=0;j<3;j++){ rtot += mtx[i][j] ctot[j] += mtx[i][j]; stot += mtx[i][j]; printf("%3d ",mtx[i][j]); } printf(" %3d\n",rtot); } printf("\n"); for(j=0;j<3;j++) printf("%3d ",ctot[j]); printf(" %3d\n",rtot); この5問をプログラミングに詳しい方教えてください!切実です。。1問だけでも構いませんのでよろしくお願いします。

  • Cのソースコードについて

    #include<stdio.h> int main(void) { long a[6000],sum[6000],max=0; int i,j=0,n,m; for (m = 0; m <= 6000; m++) sum[m] = 0; for (i = 0;; i++) { scanf_s("%ld", &a[i]); if (a[i] > 0) sum[j] += a[i]; else if (a[i] < 0) { j++; sum[j] = -1; j++; } else break; } for (n = 0; sum[n] == 0; n++) { if (max < sum[n]) max = sum[n]; } printf("%ld",max); while(1){} return 0; } こんなコードを書いたのですが 答えが常に0になってしまいます。 原因がはっきりしないので教えてください 使用言語はCです

  • csvファイルを読み込んで二次元配列に格納したい

    200×250のある数字と文字の入力されたcsvファイル(またはtxtファイル)を読み込んで2次元配列に格納したいのです。 色々調べるとカンマの処理が必要ということがわかりましたが、どのようにソースを書けばよいかわかりません。使用言語はC言語です。 また、実際にcsvファイルを読み込むようにプログラムを書いてみましたが、すべて-858993460となって表示されます。 プログラミング初心者で勉強中なため困っています。 回答よろしくお願いします。 #include <stdio.h> #include <stdlib.h> #define row 200 #define column 250 int main() { int i, j; int data[row][column]; FILE *fp; fp = fopen("sample.csv", "r"); if (fp == NULL){ printf("ファイルがありません\n"); return 1; } for (i = 0; i < row; i++){ for (j = 0; j < column; j++){ fscanf(fp, "%lf", &data[i][j]); } } for (i = 0; i<row; i++){ for (j = 0; j < column; j++){ printf("%3d ", data[i][j]); } printf("\n"); } fclose(fp); return 0; }

  • 作っているプログラムが分かりません・・・

    プログラムが… 以下のプログラムを作っているのですが、よく分かりません・・・ A監督が 77,B走塁コーチは 78 です.さて,77 と 78の素因数の和は等しくなっています. つまり,77=7×11,78=2×3×13,7+11=18,2+3+13=18 となっています. このように,素因数の和が互いに等しいという条件を満たすような, 差が 1 の自然数の組を 20000 以下でできるだけ多く探索しましょう. ここで,20000 以下には 26 組しかないことがわかっています. #include<stdio.h> #difine MAX 20000 int main(){ int sum[MAX+1]; int i,j,n; for(i = 2;i <= MAX;i++){ j = 2; while(j*j <= i){ if(i % j == 0){ _________________; break; } else j++; } if(j*j > i) ___________________; } n = 0; for(i = 2;i < MAX;i++) if(sum[i] == sum[i+1]){ n++; printf("%3d (%d,%d)\n",n,i,i+1); } return 0; } 補足 分からないのはプログラムの書き方で _________________;の部分だけでも答えていただけるとありがたいです。

専門家に質問してみよう