HDU 6341 Let Sudoku Rotate

#include<bits/stdc++.h>
using namespace std;
#define rep(i,a,b) for(int i=a;i<=b;++i)
#define ms(arr,a) memset(arr,a,sizeof arr)
#define debug(x) cout<<"< "#x" = "<<x<<" >"<<endl
char s[16][17],tmp[4][5];
void rot(int x,int y)
{
    for(int i=0;i<4;++i)
        for(int j=0;j<4;++j)
        tmp[i][j]=s[4*x-1-j][4*y-4+i];
    for(int i=0;i<4;++i)
        for(int j=0;j<4;++j)
        s[4*x-4+i][4*y-4+j]=tmp[i][j];
}
bool judge(int x,int y)
{
    int a[20];
    for(int i=4*x-4;i<4*x;++i)
    {
        ms(a,0);
        for(int j=0;j<4*y;++j)
        {
            if(a[s[i][j]]>0)return false;
            a[s[i][j]]++;
        }
    }
    for(int i=4*y-4;i<4*y;++i)
    {
        ms(a,0);
        for(int j=0;j<4*x;++j)
        {
            if(a[s[j][i]]>0)return false;
            a[s[j][i]]++;
        }
    }
    return true;
}
int ans;
void dfs(int x,int y,int now)
{
    if(now>=ans)return;
    if(x==5){ans=min(ans,now);return;}
    if(y==5){dfs(x+1,1,now);return;}
    for(int i=0;i<4;++i)
    {
        if(judge(x,y))dfs(x,y+1,now+i);
        rot(x,y);
    }
}
int main()
{
    int T;scanf("%d",&T);
    while(T--)
    {
        ans=100;
        for(int i=0;i<16;++i)scanf("%s",s[i]);
        for(int i=0;i<16;++i)
            for(int j=0;j<16;++j)
        {
            if(isdigit(s[i][j]))s[i][j]-=48;
            else s[i][j]-=55;
        }
        dfs(1,1,0);
        printf("%d
",ans);
    }
}
原文地址:https://www.cnblogs.com/maoruimas/p/9626628.html