Untitled

 avatar
unknown
c_cpp
2 years ago
2.6 kB
6
Indexable
#include<stdio.h>
#include<stdbool.h>

int count;
int n,m;
void place(int row, int q[n+m], int a, int r[n+m], int b);
bool valid(int row, int col, int q[n+m], int r[n+m]);
bool valid2(int row, int col, int q[n+m], int r[n+m]);

int main()
{

    while(scanf("%d %d", &n, &m)!=EOF)
    {
        count = 0;
        int a,b;
        a=n,b=m;
        int q[n+m];
        int r[m+n];
        for(int i=0; i<n+m; i++)
            q[i] = -100;
        for(int i=0; i<m+n; i++)
            r[i] = -100;

        place(0,q,a,r,b);
        printf("%d\n", count);
    }
}

void place(int row, int q[n+m], int a, int r[m+n], int b)
{
    if(row==n+m)
    {
        count++;
        return;
    }
    else
    {
        if(a>0)
        {
        for(int i=0; i<n+m; i++)
            {
                if(valid(row,i,q,r))
                {
                    bool ok = true;

                    for(int j=0; j<row; j++)
                {
                    if(r[j] == i)
                    {
                        //printf("C%d", i);
                        ok = false;
                    }
                }
                    if(ok)
                    {
                        q[row] = i;
                        place(row+1,q,a-1,r,b);
                    }
                }
            }
            q[row] = -100;
        }

        if(b>0)
        {
        for(int i=0; i<n+m; i++)
            {
                bool ok = true;

                if(!valid2(row,i,q,r))
                {
                    //printf("A");
                    ok = false;
                }

                for(int j=0; j<row; j++)
                {
                    if(r[j] == i)
                    {
                        //printf("A%d", i);
                        ok = false;
                    }
                }
                if(ok)
                {
                    r[row] = i;
                    //printf("B%d", i);
                    place(row+1,q,a,r,b-1);
                }
            }
            r[row] = -100;
        }
    }
}

bool valid(int row, int col, int q[n+m], int r[n+m])
{
    for(int i=0; i<row ; i++)
    {
        if(q[i] == col || q[i] == col-row+i || q[i] == row+col-i || r[i] == col || r[i] == col-row+i || r[i] == row+col-i)
            return false;
    }
    return true;
}

bool valid2(int row, int col, int q[n+m], int r[n+m])
{
    for(int i=0; i<row ; i++)
    {
        if(q[i] == col || q[i] == col-row+i || q[i] == row+col-i )
            return false;
    }
    return true;
}
Editor is loading...