質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

解決済

3回答

303閲覧

8-Queen 8クイーン 8Queen 8queen プログラム コアダンプ を解決したい。

ZhenZeZhang

総合スコア33

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

0クリップ

投稿2018/12/04 05:53

編集2018/12/04 10:42

コアダンプが起こりまして -o -g しても何も起こりませんでした。(NQueenを解く問題です。)
現在はp「-1」になるところを修正しています。
自分では何時間も考慮したのですか、いかにしてp「-1」を解決するのかが見つからないく、もし何か良い方法があればぜひおねがいして教えてほしいです。

#include<stdlib.h> #define N 4 int p[N], r=0; int check(int x,int y) { int i, j; for(i=0; i<N; i++) { for(j=0; j<i; j++) { if(p[i]==p[j]) return 1; } } return 0; } void qp(int n) { int i, l, m, k; for(i=0; i<N; i++) { printf("ok1"); p[n]=i; if(abs(p[n]- p[n-1]) !=1 && p[n]-p[n-1]==0) { printf("ok2"); if(N-1 == n)//queen place check. { printf("ok3 "); if(check(p[m], p[l]) == 0) { for(k=0; k<N; k++)printf("%d ", p[k]); printf("\n"); } } } else { qp(n+1); } } } int main(void) { int i; for(i=0; i<N; i++)p[i]=0; for(i=0; i<N; i++) { printf("ok0"); p[0]=i; qp(1); } } コード

これを用いて編集をして

#include<stdio.h> #include<stdlib.h> #define N 8 int p[N]; int check(int x,int y) { int i, j; for(i=0; i<N; i++) { for(j=i+1; j<i; j++) { if(p[i]==p[j]) return 1; } } return 0; } void qp(int n) { int i, l, m, k; for(i=0; i<N; i++) { printf("ok1"); p[n]=i; if(abs(p[n]- p[n-1]) !=1 && p[n]-p[n-1]==0) { printf("ok2"); if(N-1 == n)//queen place check. { printf("ok3 "); if(check(p[m], p[l]) == 0) { for(k=0; k<N; k++)printf("%d ", p[k]); printf("\n"); } } } else { qp(n+1); } } } int main(void) { int i; for(i=0; i<N; i++)p[i]=0; for(i=0; i<N; i++) { printf("ok0"); p[0]=i; qp(1); } } コード

結果:$ ./a
ok0ok1ok2ok1ok1ok1ok2ok1ok1ok1ok2ok1ok1ok1ok2ok3 0 1 0 1 0 1 0 0
Segmentation fault (コアダンプ)
の進展ができました。現在コアダンプのところを解読しています。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

ベストアンサー

なんで、そんなに複雑なコードになるのか不思議です。
セグメンテーションフォールトの解決にはなりませんが、
私なら次のように書きます。

C

1#include <stdio.h> 2 3#define N 8 4 5int p[N]; 6 7int check(int n, int i) 8{ 9 for (int j = 0; j < n; j++) { 10 int k = p[j] - i; 11 if (k == 0 || k == j - n || k == n - j) return 0; 12 } 13 return 1; 14} 15 16void qp(int n) 17{ 18 if (n == N) { 19 for (int i = 0; i < N; i++) printf(" %d", p[i]); 20 putchar('\n'); 21 } 22 else 23 for (int i = 0; i < N; i++) 24 if (check(n, i)) p[n] = i, qp(n + 1); 25} 26 27int main(void) 28{ 29 qp(0); 30}

投稿2019/08/12 00:27

kazuma-s

総合スコア8224

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ZhenZeZhang

2019/08/14 10:37

回答ありがとうございます。だいぶ前の投稿だったので、すこし復習してぜひ参考にさせていただきます。ありがとうございます。
guest

0

C

1void qp(int n) 2{ 3 int i, l, m, k; 4 5 for(i=0; i<N; i++) 6 // 途中省略 7 printf("ok3 "); 8 printf("\tDEBUG: m = %d, l = %d\n", m, l); // ADDED 9 if(check(p[m], p[l]) == 0) 10

ここの m, l は不定値のまま使われています。なぜこんなコードを書いたのかな?

投稿2019/08/11 13:19

rubato6809

総合スコア1380

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ZhenZeZhang

2019/08/14 10:38

自分も正直多くの資料を調べて組み立てたものなので、正直自分でもわかってないところが結構あります。改めて理解しなおしてところで回答を参考にさせていただきます。ありがとうございます。
guest

0

Segmentation faultが出る理由だけ記載しておきます

C

1#define N 4 2int p[N], r=0;

pは要素数4ですが4以上でアクセスしてる時があるため

C

1void qp(int n) 2{ 3 int i, j= p[n-1], l, m, k;

nが0のときp[n-1]はp[-1]なのでおかしい

投稿2018/12/04 07:08

rururu3

総合スコア5545

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ZhenZeZhang

2018/12/04 10:27

大切なアドバイスありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問