sgu 125 Shtirlits

题意:构造方格。

用dfs从左到右,上到下填。填一个就看左边和上边(如果有)的还能不能。左边的进行可行性检测,就是计算周围大于自己的数量,没填的算大于自己,然后看能不能>条件。而对上方的元素进行确定性检测,就是是否严格等于。注意最后一行对左边要确定性检测,而要对最后一个元素单独进行一次确定性检测。

#include <iostream>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <vector>
#include <iomanip>
#include <cstring>
#include <map>
#include <queue>
#include <set>
#include <cassert>
#include <list>
using namespace std;
const double EPS=1e-8;
const int SZ=1e2+10,INF=0x7FFFFFFF;
const long long mod=19999997;
typedef long long lon;
int n,sum[9],arr[9];

bool chk(int x,int t)
{
    int res=0;
    if(x/n&&arr[x]<arr[x-n])++res;
    if(x%n&&arr[x]<arr[x-1])++res;
    if(x/n!=n-1)
    {
        if(t)
        {
            if(arr[x]<arr[x+n])++res;
        }
        else ++res;
    }
    if(x%n!=n-1)
    {
        //if(t)
        {
            if(arr[x]<arr[x+1])++res;
        }
        //else ++res;
    }
    return t?res==sum[x]:res>=sum[x];
}

bool dfs(int x)
{
    //cout<<x<<endl;
    if(x==n*n)
    {
//        for(int i=0;i<n*n;++i)
//        {
//            cout<<arr[i]<<" ";
//        }cout<<endl;
        return 1;
    }
    for(int i=1;i<10;++i)
    {
        arr[x]=i;
        if(x%n&&chk(x-1,0||((x-1)/n==n-1))==0)continue;
        if(x/n&&chk(x-n,1)==0)continue;
        if(x==n*n-1&&chk(x,1)==0)continue;
        //cout<<x<<" "<<i<<endl;
        if(dfs(x+1))return 1;
        //else cout<<x<<" "<<i<<" fail"<<endl;
    }
    arr[x]=0;
    return 0;
}

int main()
{
    std::ios::sync_with_stdio(0);
    //freopen("d:\\1.txt","r",stdin);
    int casenum;
    //cin>>casenum;
    //scanf("%d",&casenum);
    //for(int time=1;time<=casenum;++time)
    //for(int time=1;cin>>n;++time)
    {
        cin>>n;
        for(int i=0;i<n*n;++i)
        {
            cin>>sum[i];
        }
        if(n==1)
        {
            if(sum[0]==0)cout<<1<<endl;
            else cout<<"NO SOLUTION"<<endl;
        }
        else if(dfs(0))
        {
            for(int i=0;i<n*n;++i)
            {
                if(i%n)cout<<" ";
                cout<<arr[i];
                if(i%n==n-1)cout<<endl;
            }
        }
        else
        {
            cout<<"NO SOLUTION"<<endl;
        }
    }
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/gaudar/p/9764382.html
sgu
125