Problem p01349 (C++)

Buggy submission (status: Time Limit Exceeded):
#include <stdio.h>
#include <string.h>

void swap(char *a, char *b) {
  char tmp;
  tmp = *a;
  *a = *b;
  *b = tmp;
}

int h, w;
char t[30][31];

void fall(void) {
  int i, j, k;
  for (i = h - 2; i >= 0; i--) {
    for (j = 0; j < w; j++) {
      if (t[i + 1][j] == '.') {
        for (k = i; k < h && t[k + 1][j] == '.'; k++)
          ;
        t[k][j] = t[i][j];
        t[i][j] = '.';
      }
    }
  }
}

int range(int a, int b) { return a >= 0 && a < h && b >= 0 && b < w; }

int main(void) {
  int i, j, k, l, n, m, p, f, ans, del[30][30], dx[4] = {0, 1, 0, -1},
                                                dy[4] = {-1, 0, 1, 0};
  char v[30][31];
  scanf("%d%d%d%*c", &h, &w, &n);
  for (i = 0; i < h; i++) {
    for (j = 0; j < w; j++)
      v[i][j] = getchar();
    getchar();
  }
  ans = 0;
  for (i = 0; i < h; i++) {
    for (j = 0; j < w - 1; j++) {
      memcpy(t, v, sizeof(v));
      if (t[i][j] == t[i][j + 1] && t[i][j] == '.')
        continue;
      swap(&t[i][j], &t[i][j + 1]);
      fall();
      while (1) {
        f = 1;
        memset(del, 0, sizeof(del));
        for (k = 0; k < h; k++) {
          for (l = 0; l < w; l++) {
            if (t[k][l] != '.') {
              for (m = 0; m < 4; m++) {
                for (p = 0; range(k + dy[m] * p, l + dx[m] * p) &&
                            t[k + dy[m] * p][l + dx[m] * p] == t[k][l];
                     p++)
                  ;
                if (p >= n) {
                  f = 0;
                  for (p = 0; range(k + dy[m] * p, l + dx[m] * p) &&
                              t[k + dy[m] * p][l + dx[m] * p] == t[k][l];
                       p++)
                    del[k + dy[m] * p][l + dx[m] * p] = 1;
                }
              }
            }
          }
        }
        if (f)
          break;
        while (getchar() != 'e')
          ;
        for (k = 0; k < h; k++)
          for (l = 0; l < w; l++)
            if (del[k][l])
              t[k][l] = '.';
        fall();
      }
      for (k = 0; k < h; k++) {
        for (l = 0; l < w; l++)
          if (t[k][l] != '.')
            break;
        if (l != w)
          break;
      }
      if (k == h)
        ans = 1;
    }
  }
  if (ans)
    printf("YES\n");
  else
    printf("NO\n");
  return 0;
}

Fixed submission:
#include <stdio.h>
#include <string.h>

void swap(char *a, char *b) {
  char tmp;
  tmp = *a;
  *a = *b;
  *b = tmp;
}

int h, w;
char t[30][31];

void fall(void) {
  int i, j, k;
  for (i = h - 2; i >= 0; i--) {
    for (j = 0; j < w; j++) {
      if (t[i + 1][j] == '.') {
        for (k = i; k < h && t[k + 1][j] == '.'; k++)
          ;
        t[k][j] = t[i][j];
        t[i][j] = '.';
      }
    }
  }
}

int range(int a, int b) { return a >= 0 && a < h && b >= 0 && b < w; }

int main(void) {
  int i, j, k, l, n, m, p, f, ans, del[30][30], dx[4] = {0, 1, 0, -1},
                                                dy[4] = {-1, 0, 1, 0};
  char v[30][31];
  scanf("%d%d%d%*c", &h, &w, &n);
  for (i = 0; i < h; i++) {
    for (j = 0; j < w; j++)
      v[i][j] = getchar();
    getchar();
  }
  ans = 0;
  for (i = 0; i < h; i++) {
    for (j = 0; j < w - 1; j++) {
      memcpy(t, v, sizeof(v));
      if (t[i][j] == t[i][j + 1] && t[i][j] == '.')
        continue;
      swap(&t[i][j], &t[i][j + 1]);
      fall();
      while (1) {
        f = 1;
        memset(del, 0, sizeof(del));
        for (k = 0; k < h; k++) {
          for (l = 0; l < w; l++) {
            if (t[k][l] != '.') {
              for (m = 0; m < 4; m++) {
                for (p = 0; range(k + dy[m] * p, l + dx[m] * p) &&
                            t[k + dy[m] * p][l + dx[m] * p] == t[k][l];
                     p++)
                  ;
                if (p >= n) {
                  f = 0;
                  for (p = 0; range(k + dy[m] * p, l + dx[m] * p) &&
                              t[k + dy[m] * p][l + dx[m] * p] == t[k][l];
                       p++)
                    del[k + dy[m] * p][l + dx[m] * p] = 1;
                }
              }
            }
          }
        }
        if (f)
          break;
        for (k = 0; k < h; k++)
          for (l = 0; l < w; l++)
            if (del[k][l])
              t[k][l] = '.';
        fall();
      }
      for (k = 0; k < h; k++) {
        for (l = 0; l < w; l++)
          if (t[k][l] != '.')
            break;
        if (l != w)
          break;
      }
      if (k == h)
        ans = 1;
    }
  }
  if (ans)
    printf("YES\n");
  else
    printf("NO\n");
  return 0;
}