
#include <stdlib.h>
#include <stdio.h>

#define S 7
#define M 4
#define N (S*S) / M

int cell(int grid[S][S], int x, int y)
{
    if (x < 0 || x >= S) return 0;
    if (y < 0 || y >= S) return 0;
    
    return grid[y][x];
}

int solve(int *repo, int grid[S][S], int x, int y)
{
    if (y == S) {  
        int i, j;
        
        for (i = 0; i < 7; i++) {
            for (j = 0; j < 7; j++) {
                putchar(".RGYB"[grid[j][i]]);
            }
            putchar(10);
        }
        putchar(10);
          
        return 1;
    } else {
        int nextx = x + 1;
        int nexty = y;
        int res = 0;
        int i;
        
        if (nextx == 7) {
            nextx = 0;
            nexty++;
        }
        
        for (i = 0; i < M + 1; i++) {
            if (repo[i] == 0) continue;
            if (i && cell(grid, x - 1, y - 1) == i) continue;
            if (i && cell(grid, x + 0, y - 1) == i) continue;
            if (i && cell(grid, x + 1, y - 1) == i) continue;
            if (i && cell(grid, x - 1, y + 0) == i) continue;
            
            grid[y][x] = i;
            repo[i]--;
            
            res += solve(repo, grid, nextx, nexty);
            
            grid[y][x] = 0;
            repo[i]++;
        }
        
        return res;
    }
}

int main()
{
    int repo[M + 1] = {1, N, N, N, N};
    int grid[S][S] = {{0}};
    int n;
    
    n = solve(repo, grid, 0, 0);
    
    printf("%d cells, %d groups of %d prisoners: %d\n", S*S, M, N, n);

    return 0;
}
