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

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

ただいまの
回答率

90.50%

  • C

    3692questions

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

チェーンコード探索について

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 126

bb.shun712

score 1

 前提・実現したいこと

フリーマンのチェーンコードを実装しています
8方向は
567
4  0
123
です。
配列を探索し[1]の場合にSwsw関数に渡し再帰関数で求めようとしています。
height,widthに位置情報を記録し双方が0になった時に探索終了です。

 発生している問題・エラーメッセージ

問題1:Swsw関数内のif(sw != 1)にあたる部分の文が機能していない。
問題2:height,widthの値に0を入れて回したのですがSwsw内のswitchを抜けない。

 該当のソースコード

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>

//チェーンコード探索プログラム
void Swsw(int sw,int i,int j,int gg[][16]){
  static int width;
  static int height;

  switch(sw){
  case 0:
    if(gg[i][j+1] == 1){
      j ++;
      width ++;
      printf("(%d,%d)",i,j);
      printf("(width%d height%d)",width,height);
      puts("0");
      for(sw = 0;sw < 8;sw++){
    if(sw != 4){
      if(width == 0 && height == 0){
        break;
      }
      Swsw(sw,i,j,gg);
    }
      }
    }

  case 1:
    if(gg[i+1][j+1] == 1){
      i ++;
      j ++;
      width ++;
      height ++;
      printf("(%d,%d)",i,j);
      printf("(width%d height%d)",width,height);
      puts("1");
      for(sw = 0;sw < 8;sw++){
    if(sw != 5){
      if(width == 0 && height == 0){
        break;
      }
      Swsw(sw,i,j,gg);
    }
      }
    }

  case 2:
    if(gg[i+1][j] == 1){
      i ++;
      height ++;
      printf("(%d,%d)",i,j);
      printf("(width%d height%d)",width,height);
      puts("2");
      for(sw = 0;sw < 8;sw++){
    if(sw != 6){
      if(width == 0 && height == 0){
        break;
      }
      Swsw(sw,i,j,gg);
    }
      }
    }

  case 3:
    if(gg[i+1][j-1] == 1){
      i ++;
      j --;
      width--;
      height ++;
      printf("(%d,%d)",i,j);
      printf("(width%d height%d)",width,height);
      puts("3");
      for(sw = 0;sw < 8;sw++){
    if(sw != 7){
      if(width == 0 && height == 0){
        break;
      }
      Swsw(sw,i,j,gg);
    }
      }
    }

  case 4:
    if(gg[i][j-1] == 1){
      j --;
      width --;
      printf("(%d,%d)",i,j);
      printf("(width%d height%d)",width,height);
      puts("4");
      for(sw = 0;sw < 8;sw++){
    if(sw != 0){
      if(width == 0 && height == 0){
        break;
      }
      Swsw(sw,i,j,gg);
    }
      }
    }

  case 5:
    if(gg[i-1][j-1] == 1){
      i --;
      j --;
      height --;
      width --;
      printf("(%d,%d)",i,j);
      printf("(width%d height%d)",width,height);
      puts("5");
      for(sw = 0;sw < 8;sw++){
    if(sw != 1){
      if(width == 0 && height == 0){
        break;
      }
      Swsw(sw,i,j,gg);
    }
      }
    }

  case 6:
    if(gg[i-1][j] == 1){
      i --;
      height --;
      printf("(%d,%d)",i,j);
      printf("(width%d height%d)",width,height);
      puts("6");
      for(sw = 0;sw < 8;sw++){
    if(sw != 1 || sw != 2){
      if(width == 0 && height == 0){
        break;
      }
      Swsw(sw,i,j,gg);
    }
      }
    }

  case 7:
    if(gg[i-1][j+1] == 1){
      i ++;
      j --;
      width ++;
      height --;
      printf("(%d,%d)",i,j);
      printf("(width%d height%d)",width,height);
      puts("7");
      for(sw = 0;sw < 8;sw++){
    if(sw != 3){
      if(width == 0 && height == 0){
        break;
      }
      Swsw(sw,i,j,gg);
    }
      }
    }
  }
}

int main(void) {
  int a = 0;
  int sw = 0;
  static int l;
  int ss[16][16] ={
    {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
    {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
    {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
    {0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0},
    {0,0,0,0,1,1,0,0,0,0,1,1,0,0,0,0},
    {0,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0},
    {0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0},
    {0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0},
    {0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0},
    {0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0},
    {0,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0},
    {0,0,0,0,1,1,0,0,0,0,1,1,0,0,0,0},
    {0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0},
    {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
    {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
    {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}};
  int sq[16][16] ={
    {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
    {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
    {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
    {0,0,0,1,1,1,1,1,1,1,1,1,1,0,0,0},
    {0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0},
    {0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0},
    {0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0},
    {0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0},
    {0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0},
    {0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0},
    {0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0},
    {0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0},
    {0,0,0,1,1,1,1,1,1,1,1,1,1,0,0,0},
    {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
    {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
    {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}};

  printf("数字を入力してください。1,円 2,正方形\n");
  scanf("%d",&a);
  if(a == 1){
    for(int i = 0; i < 17; i++){
      for(int j = 0; j < 17; j++){
    if(ss[i][j] == 1){
      if(l == 0){
        l++;
        printf("チェーンコード開始位置は(%d,%d)です。\n",i,j);
        for(sw = 0;sw < 4;sw++){
          Swsw(sw, i, j, ss);
        }
      }
    }
      }
    }
  }
  else if(a == 2){
    for(int i = 0; i < 17; i++){
      for(int j = 0; j < 17; j++){
    if(sq[i][j] == 1){
      if(l == 0){
        l++;
        printf("チェーンコード開始位置は%d %dです。\n",i,j);
        for(sw = 0;sw < 4;sw++){
          Swsw(sw, i, j,sq);
        }
      }
    }
      }
    }
  }
  else{
    printf("1か2を入力してください。");
  }
}

 試したこと

 補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

0

switch 文のcase 文の終端には break; が必要です
これがないとそのまま次の case に突入します

  switch(sw){
  case 0:
    if(gg[i][j+1] == 1){
      j ++;
      width ++;
      printf("(%d,%d)",i,j);
      printf("(width%d height%d)",width,height);
      puts("0");
      for(sw = 0;sw < 8;sw++){
    if(sw != 4){
      if(width == 0 && height == 0){
        break;
      }
      Swsw(sw,i,j,gg);
    }
      }
    }

    break;     // << これがないと、そのまま次の case 1: も実行してしまう

  case 1:
    if(gg[i+1][j+1] == 1){


すべてのcase文の終端に break; いれましょう。

#意図してbreak 入れないというテもあるけど。


それと、
このように、インデントをちゃんとしたほうが見やすくありませんか。

  switch(sw){
  case 0:
    if(gg[i][j+1] == 1){
      j ++;
      width ++;
      printf("(%d,%d)",i,j);
      printf("(width%d height%d)",width,height);
      puts("0");
      for(sw = 0;sw < 8;sw++){
        if(sw != 4){
          if(width == 0 && height == 0){
            break;
          }
          Swsw(sw,i,j,gg);
        }
      }
    }
    break;
  case 1:
    if(gg[i+1][j+1] == 1){

#コードのロジックは見てないのであしからず

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 90.50%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

  • 解決済

    Cで行列のランク計算のプログラムを作っています。

    前提・実現したいこと Cで行列のランク計算をするプログラムを作っています。 プログラムの流れは、 1.行列の行数(lnum)、列数(cnum)を入力 2.行列の各成分を

  • 受付中

    luaでの参照渡しの仕方

    いまcで書かれたものをluaに書き換えようと思っています その際にdefineで定義されたマクロ関数を書き直す際に、 luaで関数内で引数を書き換えたら実引数も書き換わるということ

  • 解決済

    [c]一つのデータでカラム数が変わるデータの読み込み

    質問失礼します。プログラム初心者です。 以下のような〜〜〜.datを fp1 = fopen(fname1,"r"); while((ret = fscanf(fp1,"%d %d

  • 解決済

    C言語でわからないこと

    include <stdio.h> float calc(char op, float a, float b); main(){ float number; number 

  • 解決済

    フィボナッチ数について

    フィボナッチ数で回帰を使わずに動かしたいです。 自分はwhileの中身をどうにかできたら動く思うのですがどうですか? アドバイスをください。 include <stdio.h>

  • 解決済

    繰り返しの表現の追加

    合計得点が21点以上の時か10回じゃんけんをしたときにプログラムを終了する。という条件を付けくわえたいです。 どのように表現すればいいのかアドバイスください。 #define

  • 解決済

    1次元配列(全ての組み合わせの2組の数同士の掛け算)

    5つの整数a0〜a4をキーボードから入力し、すべての組み合わせの2組の数同士の掛け算ai×aj(i.j=0.1.2.3.4)を計算するプログラムを作成せよ scanfを用いて値

  • 受付中

    はさみ将棋の囲み判定

     はさみ将棋をc言語で作っており、囲まれた時の判定をどのように判定したらいいのかわからずに困ってます。 はさみ将棋をc言語で作っており、挟まれた時の判定はできたのですが、囲まれた時

同じタグがついた質問を見る

  • C

    3692questions

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