オセロ

#include <stdio.h>
#define MaxW 128

void extract_T_preparation(char T[][MaxW], int H, int W, int *minH, int *maxH, int *minW, int *maxW){
  for(int i=0; i<H; i++){
    for(int j=0; j<W; j++){
      if(T[i][j]=='#'){
        if(i < *minH){ *minH=i;}
        if(*maxH < i){ *maxH=i;}
        if(j < *minW){ *minW=j;}
        if(*maxW < j){ *maxW=j;}
      }
    }
  }
}

void extract_T(char T[][MaxW], char extractT[][MaxW], int *minH, int *maxH, int *minW, int *maxW){
  for(int i=*minH; i<*maxH+1; i++){
    for(int j=*minW; j<*maxW+1; j++){
      extractT[i-*minH][j-*minW]=T[i][j];
    }
  }
}

void rotate_90T(char extractT[][MaxW], char rotate90T[][MaxW], int *extractT_H, int *extractT_W){
  for(int i=0; i<*extractT_H; i++){
    for(int j=0; j<*extractT_W; j++){
      rotate90T[j][*extractT_H-i-1]=extractT[i][j];
    }
  }
}

int check(char S[][MaxW], char checkT[][MaxW], int H, int W, int extractT_H, int extractT_W){
  int check_fault_flg = 0;
  if(H<extractT_H || W<extractT_W){
    return 0;
  }
  for(int i=0; i<H-extractT_H+1;i++){
    for(int j=0; j<W-extractT_W+1; j++){
      for(int extractT_i=0; extractT_i<extractT_H; extractT_i++){
        for(int extractT_j=0; extractT_j<extractT_W; extractT_j++){
          if(S[i+extractT_i][j+extractT_j]=='#' && checkT[extractT_i][extractT_j]=='#'){
            check_fault_flg=1;
            break;
          }
        }
        if(check_fault_flg==1){
          break;
        }
      }
      if(check_fault_flg==1){
        check_fault_flg=0;
      }else{
        return 1;
      }
    }
  }
  return 0;
}

int main(void){
  int H, W;
  scanf("%d %d", &H, &W);

  char S[H][MaxW];
  char T[H][MaxW];
  for(int i=0; i<H; i++){
    scanf("%s", S[i]);
  }

  for(int i=0; i<H; i++){
    scanf("%s", T[i]);
  }

  int minH=128;
  int maxH=-1;
  int minW=128;
  int maxW=-1;
  extract_T_preparation(T, H, W, &minH, &maxH, &minW, &maxW);
  int extractT_H=maxH - minH + 1;
  int extractT_W=maxW - minW + 1;
  char extractT[extractT_H][MaxW];
  extract_T(T, extractT, &minH, &maxH, &minW, &maxW);

  // 0, 90, 180, 270度回転させて確認
  int flag = check(S, extractT, H, W, extractT_H, extractT_W);
  if(flag) {printf("Yes\\n"); return 0;}

  char rotated90T[extractT_W][MaxW];
  rotate_90T(extractT, rotated90T, &extractT_H, &extractT_W);
  flag = check(S, rotated90T, H, W, extractT_W, extractT_H);
  if(flag) {printf("Yes\\n"); return 0;}

  char rotated180T[extractT_H][MaxW];
  rotate_90T(rotated90T, rotated180T, &extractT_W, &extractT_H);
  flag = check(S, rotated180T, H, W, extractT_H, extractT_W);
  if(flag) {printf("Yes\\n"); return 0;}

  char rotated270T[extractT_W][MaxW];
  rotate_90T(rotated180T, rotated270T, &extractT_H, &extractT_W);
  flag = check(S, rotated270T, H, W, extractT_W, extractT_H);
  if(flag) {printf("Yes\\n"); return 0;}
  printf("No\\n");
  return 0;
}

リーディングゼロ

6
1111111111111111111111
0001
0000001
0000000001
0000000000001
0000000000000001
#include <stdio.h>

long long int atoi(char *str) {
  long long int i, n = 0;
  for (i = 0; str[i] >= '0' && str[i] <= '9'; i++) {
    n = n * 10 + (str[i] - '0');
  }
  return n;
}

int count_zero(char str[128]){
  int count=0;
  while(*str=='0'){
    count++;
    str++;
  }
  return count;
}

void swap(char str[][128], int swap_i, int swap_j){
  char tmp[128] = {"0"};
  for(int i=0; i<128; i++){
    tmp[i] = str[swap_i][i];
  }
  for(int i=0; i<128; i++){
    str[swap_i][i] = str[swap_j][i];
  }
  for(int i=0; i<128; i++){
    str[swap_j][i] = tmp[i];
  }
}

void sorting(char str[][128], int N){
    unsigned long long min_num=1844674407370955161;
    int zero_max_count=0;
    long long int tmp_num, tmp_zero_count;
    int cur_i, cur_j;
    char *tmp_str;
    // 選択ソート
    for(int i=0; i<N-1; i++){
        min_num=1844674407370955161;
        zero_max_count=0;
        for(int j=i; j<N; j++){
          // tmp_str = reading_zero(str[j]);
          tmp_num = atoi(str[j]);
          tmp_zero_count = count_zero(str[j]);
          // printf("tmp_num;%d, tmp_zero_count:%d\\n", tmp_num, tmp_zero_count);
          if(tmp_num < min_num){
            min_num = tmp_num;
            zero_max_count = tmp_zero_count;
            cur_i = i;
            cur_j = j;
          }else if(tmp_num==min_num && zero_max_count < tmp_zero_count){
            min_num = tmp_num;
            zero_max_count = tmp_zero_count;
            cur_i = i;
            cur_j = j;
          }
        }
        // puts("");
        swap(str, cur_i, cur_j);
        // printf("cur_i:%d, cur_j:%d\\n", cur_i, cur_j);
    }
}

int main() {
    int N;
    char str[N][128];

    scanf("%d", & N);
    for(int i=0; i<N; i++){
      scanf("%s", str[i]);
    };

    puts("");

    sorting(str, N);
    // swap(str, 0, 1);
    for(int i=0; i<N; i++){
      printf("%s\\n", str[i]);
    };

}