Untitled
unknown
c_cpp
3 years ago
2.6 kB
9
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...