zoukankan      html  css  js  c++  java
  • Shtirlits

    题目大意: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
    ");
        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?'
    ':' ');
        }
    
        return 0;
    }
  • 相关阅读:
    BSGS算法(大步小步算法)
    UVA-11426【GCD
    UVA-1637【Double Patience】(概率dp)
    UVA-11174【Stand in a Line】
    About
    51nod 1355 斐波那契的最小公倍数
    CodeForces
    CodeForces
    CodeForces
    CodeForces 901C Bipartite Segments
  • 原文地址:https://www.cnblogs.com/liuxin13/p/4836201.html
Copyright © 2011-2022 走看看