Вы получаете сообщение об ошибке >> free (q);
for m=n=4
int* q = (int*)malloc(m*n * sizeof(int));
q == [m*n*sizeof(int)] == 4*4*4 == 64 bytes == int[16];
Поскольку вы записали за пределы адресного пространства, зарезервированного для переменной-указателя 'q'. проверьте переменную count перед свободным (q). У меня есть 1208, вызванный с помощью:
char* visited = new char[100 * 100];
memset(visited, 0, 10000);
int res = SSavep(visited, 0, 4, 4);
Кстати, этот al go выглядит очень похоже на поиск пути, который исследует соседние ячейки на карте и присваивает веса, верно? Если это так, есть много решений с открытым исходным кодом, почему бы не использовать их вместо изобретения колеса? На вики-странице Path Finding есть ссылки на решения с открытым исходным кодом:
https://en.wikipedia.org/wiki/Pathfinding
проверьте ссылки внизу страницы.