Shtirlits - SGU 125(搜索)

时间:2023-03-10 03:06:21
Shtirlits - SGU 125(搜索)

题目大意:B[i, j]表示周围有多少个比它大的数,能否用B数组构造出一个A数组,如果不能输出“NO SOLUTION”。

分析:数据规模比较小,可以直接暴力枚举每个点的值。

代码如下:

#include<stdio.h>
#include<algorithm>
#include<string.h>
#include<math.h>
using namespace std; const int MAXN = ; int dir[][][] = {{},{},{{},{,},{,},{,},{,}},
{{},{,},{,,},{,},{,,},{,,,},{,,},{,},{,,},{,}}};
int near[][][] = {{},{},{{},{},{},{},{,}},{{},{},{},{},{},{,},{,},{},{,},{,}}};
int B[MAXN], A[MAXN], ok, N; bool nBigger(int k)
{
int i, cnt = , zero=; for(i=; dir[N][k][i]; i++)
{
if(A[k] < A[dir[N][k][i]])
cnt++;
if(!A[dir[N][k][i]])
zero++;
} if(cnt > B[k])
return false;
if(cnt+zero < B[k])
return false;
return true;
}
void DFS(int k)
{
int i, j; if(k == N*N+)
ok = ; if(ok)return ; for(i=; i<MAXN; i++)
{
A[k] = i;
if(nBigger(k) == false)
continue;
for(j=; near[N][k][j]; j++)
{
if(!nBigger(near[N][k][j]))
break;
} if(near[N][k][j] == )
DFS(k+); if(ok)return ;
} A[k] = ;
} int main()
{
scanf("%d", &N); for(int i=; i<=N; i++)
for(int j=; j<=N; j++)
scanf("%d", &B[(i-)*N+j]); DFS(); if(!ok)
printf("NO SOLUTION\n");
else
{
for(int i=; i<=N; i++)
for(int j=; j<=N; j++)
printf("%d%c", A[(i-)*N+j], j==N?'\n':' ');
} return ;
}

相关文章