[JZOJ3422] 아쿠아 댄스

기술

아쿠아 생일 선물로 격자 모양의 화려한 카펫 왔으며,보다 구체적으로 그리드에 카펫의 색상이 쇄도 변경할 수 있습니다.

그녀의 우상 무지개 고양이를 기쁘게하기 위해, 아쿠아 모에를 판매하는 카펫에 빛의 춤을 춤을하기로 결정 ~ ~ ~

카펫 N 행과 N 열에서 그리드, 0~5 사이의 값과 각 격자 색의 대표.

아쿠아은 5 0 사이의 색상을 선택할 수 있으며, 그리드 그녀가 선택한 모든 색상이 될 곳 부드럽게 치고 단계는 차이나 유니콤은 그리드의 카펫의 왼쪽 위 모서리를 차단합니다. 두 셀의 공통 에지와 동색 : 여기서 상기 통신은 다음과 같이 정의된다.

아쿠아 춤을 회피 캐스팅되어 있기 때문에, 너무 많은 화나는를 소비하지 않기 위해, 그녀는 위해 적어도 모든 그리드 색상이 동일하게 설정하는 방법을 여러 단계를 알고 싶어.


분석

  • 긍정적 인 솔루션 \ (IDA * \) , 지식의 증가

  • \ (IDDFS \)는 곧 느리지 만 듣고, 특히 탐색 트리의 깊이를 제한한다 검색을 심화 반복이다

  • \ (A *의 \)는 현재의 스텝 수를 더한 힙 검색 정상적으로 사용하는 평가 함수이다

  • 우선, 모든 시간 염색 전에도 1의 검색 \ (1 \)는 현재의 컬러 블록 유니콤 마크 \ (2 \) 는 현재 블록의 색 유니콤의 외부 경계 마커 위치를 나머지 지점 표지 \ (0 \)를

  • 이 경우 평가 함수는, 서로 다른 색의 색의 현재 유니콤 나머지 블록 번호를 얻어 \ (0 \), 즉 전체도 하나의 컬러로 염색되었다.

  • 현재 스텝 번호 플러스 깊이 비용 함수가 한계보다 큰 경우, \ (귀국일 \)

  • 유니콤 블록의 크기가 변경되지 않은 경우 검색이 얼룩은 이해가되지 않는, 색 얼룩을 열거

  • 이 문제는 해결 될 수있다, 그래서 우리는 여전히 더 많은 지식 Pianmen이


암호

#pragma GCC optimize("O3")
#pragma G++ optimize("O3")
#include<stdio.h>
#include<string.h>
#include<algorithm>
#define ll long long
#define reg register ll
#define fo(i,a,b) for (reg i=a;i<=b;++i)
#define fd(i,a,b) for (reg i=a;i>=b;--i)

using namespace std;

ll fx[4]={0,0,1,-1},fy[4]={1,-1,0,0};
ll a[10][10],b[10];
ll bz[10][10];
bool flag;
ll n,ans;

inline ll read()
{
    ll x=0,f=1;char ch=getchar();
    while (ch<'0' || '9'<ch){if (ch=='-')f=-1;ch=getchar();}
    while ('0'<=ch && ch<='9')x=x*10+ch-'0',ch=getchar();
    return x*f;
}
inline void color(ll x,ll y,ll z)
{
    bz[x][y]=1;
    fo(i,0,3)
    {
        ll xx=x+fx[i],yy=y+fy[i];
        if (xx<1 || xx>n || yy<1 || yy>n || bz[xx][yy]==1)continue;
        bz[xx][yy]=2;
        if (a[xx][yy]==z)color(xx,yy,z);
    }
}
inline ll H()
{
    ll tmp=0;
    memset(b,0,sizeof(b));
    fo(i,1,n)fo(j,1,n)if (bz[i][j]!=1 && !b[a[i][j]])b[a[i][j]]=1,++tmp;
    return tmp;
}
inline bool judge(ll x)
{
    ll tmp=0;
    fo(i,1,n)fo(j,1,n)if (a[i][j]==x && bz[i][j]==2){++tmp,color(i,j,x);}
    return tmp>0;
}
inline bool a_star(ll x)
{
    ll tmp=H(),t[10][10];
    if (tmp==0)return 1;
    else if (tmp+x>ans)return 0;
    fo(i,0,5)
    {
        memcpy(t,bz,sizeof(t));
        if (judge(i) && a_star(x+1))return 1;
        memcpy(bz,t,sizeof(bz));
    }
    return 0;
}
int main()
{
    freopen("T1.in","r",stdin);
    for (n=read();n!=0;n=read())
    {
        memset(bz,0,sizeof(bz)),flag=0;
        fo(i,1,n)fo(j,1,n)a[i][j]=read();
        color(1,1,a[1][1]);
        for (ans=0;ans<=n*n;++ans)if (a_star(0))break;
        printf("%lld\n",ans);
    }
    return 0;
}

추천

출처www.cnblogs.com/horizonwd/p/11285019.html