C言語を使ってラベリングしようとしています。
lavel.txtはこれです
1 1 0 0 0 0 0
1 1 0 0 0 1 0
0 0 0 1 1 1 1
1 0 0 0 0 0 0
0 0 0 0 1 1 1
ラベリング
1 1 0 0 0 0 0
1 1 0 0 0 2 0
0 0 0 2 2 2 2
3 0 0 0 0 0 0
0 0 0 0 4 4 4
この1のかたまりになっているところを1、2、3、4という風にラベル付けしたいです。
元々のlabel.txtはnum配列に格納されており、新しくラベリングしたものはnum2
に格納したいです。
tikaku関数では対象となるマスの左上、真上、右上、真左。という風に隣り合っている場所が全て0になる以外はラベリングされた値を返す。というような関数を作りたいです。
関数やらnum2配列がごちゃごちゃしてうまくいかないのですがアドバイスをいただけると嬉しいです。
c
1#include <stdio.h> 2#include <stdlib.h> 3 4int tikaku(int a[5][7],int x,int y){ 5 int i=x,j=y; 6 7 8 9 10 11 if(!(a[i-1][j-1]==0&&a[i-1][j-1]=='NULL')){ 12return a[i-1][j-1]; 13 }else if(!(a[i-1][j]==0&&a[i-1][j]=='NULL')){ 14 return a[i-1][j]; 15 }else if(!(a[i-1][j+1]==0&&a[i-1][j+1]=='NULL')){ 16 17 return a[i-1][j+1]; 18 }else if(!(a[i][j-1]==0&&a[i][j-1]=='NULL')){ 19 return a[i][j-1]; 20 } 21 return a[i][j]; 22} 23 24 25 26int main(void) { 27 FILE *fp; // FILE型構造体 28 static char fname[] = "label.txt"; 29 int i,j,n,f1; 30 int num[5][7]; 31 int num2[5][7]; 32 33 34 //テキストファイルの数値を表示し配列に格納 35 fp = fopen(fname, "r"); // ファイルを開く。失敗するとNULLを返す。 36 if(fp == NULL) { 37 printf("%s file not open!\n", fname); 38 return -1; 39 } 40 for(i=0;i<5;i++){ 41 for(j=0;j<7;j++){ 42 fscanf(fp, "%d ", &f1); 43 num[i][j]=f1; 44 printf("%d ",num[i][j]); 45 } 46 printf("\n"); 47 } 48 printf("\n"); 49 50 fclose(fp); // ファイルを閉じる 51 52 53 54 n=1; 55 for(i=0;i<5;i++){ 56 for(j=0;j<7;j++){ 57 if(num[i][j]==0){ 58 num2[i][j]=0; 59 60 } else if(num[i][j]==1){ 61 62 63 num2[i][j]=n; 64 65 n=tikaku(num2,i,j); 66 num2[i][j]=n; 67 printf("%d ",num2[i][j]); 68 69 } 70 } 71 } 72 printf("\n"); 73 74 } 75 76 77 78 //for(i=0;i<5;i++){ 79 // for(j=0;j<7;j++){ 80 // printf("%d ",num2[i][j]); 81 // } 82 // printf("\n"); 83 // } 84 85 86 return 0; 87} 88 89
回答4件
あなたの回答
tips
プレビュー