if (matrix[i][j] == 0)
проверяет на ноль, если выполняется условие выводите номер столбца printf("\n[%i][%i]=%i", ii,jj,p) и увеличиваете счетчик.
По завершению вложенного цикла выводите количество printf("\ncount=%d",count) и обнуляйте счетчик.
save там определена, main отвечает за инициализацию, поэтому connect должен быть там же (так код будет понятнее), хотя он может остаться на своем месте, но в любом случае, его надо переписать через QObject.connect или реализовать в классе который наследуется от QObject (за подробностями обращайтесь к документации) , иначе он работать не будет.
ideological, Тут все зависит от стратегий игроков. Если А будет тупить, то Д может выиграть.
Тут, наверно, вопрос в том есть ли универсальная стратегия, при которой всегда выигрывает один из игроков. Но за подробностями проблематики лучше уже обращаться к математикам.
ideological, ангел(А) может тупо пойти на стену и обойти ее.
допустим дьявол(Д) начал строить стену на расстоянии nk, (k это сила), тоесть А может преодолеть это расстояние за n ходов, а Д сможет построить стену длиной n/k, c учетом того, что А может перепрыгивать стены, толщина которых меньше его силы, далее, в худшем случае, А надо потратить n/(2k^2) чтобы дойти до края стены, если Д не будет ее достраивать, но для него это не имеет смысла, так как он сможет построить только n/(2k^3) секций, тут можно на вскидку предположить, что А в любом случае дойдет до края. Тут Д лучше сразу строить новую стену, ну А опять ее обойдет, и так процесс будет продолжатся довольно долго, с учетом того, что для А это не лучшая стратегия.
Если А будет заведомо будет обходить стены, то для Д ситуация совсем печальная.