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 = 10;

int dir[4][10][5] = {{},{},{{},{2,3},{1,4},{1,4},{2,3}},
{{},{2,4},{1,3,5},{2,6},{1,5,7},{2,4,6,8},{3,5,9},{4,8},{5,7,9},{6,8}}};
int near[4][10][5] = {{},{},{{},{},{1},{1},{2,3}},{{},{},{1},{2},{1},{2,4},{3,5},{4},{5,7},{6,8}}};
int B[MAXN], A[MAXN], ok, N;

bool nBigger(int k)
{
    int i, cnt = 0, zero=0;

    for(i=0; 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+1)
        ok = 1;

    if(ok)return ;

    for(i=1; i<MAXN; i++)
    {
        A[k] = i;
        if(nBigger(k) == false)
            continue;
        for(j=0; near[N][k][j]; j++)
        {
            if(!nBigger(near[N][k][j]))
                break;
        }

        if(near[N][k][j] == 0)
            DFS(k+1);

        if(ok)return ;
    }

    A[k] = 0;
}

int main()
{
    scanf("%d", &N);

    for(int i=1; i<=N; i++)
    for(int j=1; j<=N; j++)
        scanf("%d", &B[(i-1)*N+j]);

    DFS(1);

    if(!ok)
        printf("NO SOLUTION\n");
    else
    {
        for(int i=1; i<=N; i++)
        for(int j=1; j<=N; j++)
            printf("%d%c", A[(i-1)*N+j], j==N?'\n':' ');
    }

    return 0;
}

 

posted @ 2015-09-24 18:30  无忧望月  阅读(124)  评论(0编辑  收藏  举报
levels of contents