아니면 dfs3HDU6333

16*16 16궁격도 회전 횟수 최소 행렬로 만들기 1-16 모든 수 충족
#include 
#include 
#include 
using namespace std;
char s[16][16],w[16][16];
int Ans;
int vis[16];
void roate(int a,int b)
{
    for(int i=0; i<4; i++)
        for(int j=0; j<4; j++)
            w[j][3-i]=s[a+i][b+j];
    for(int i=0; i<4; i++)
        for(int j=0; j<4; j++)
            s[a+i][b+j]=w[i][j];
}
int tot;
bool check(int a,int b)
{
    for(int i=a; i=Ans)return;//자르다
for(int t=0; t<4; t++)
{
if(check(i*4,j*4))
dfs(i,j+1,k+t);
roate(i*4,j*4);
}// 이동
}
void solve()
{
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(s[i][j]<='9')
s[i][j]-='0';
else
s[i][j]=s[i][j]-'A'+10;//사전 처리
Ans=1000;
dfs(0,0,0);
cout<>t;
while(t--)
solve();
return 0;
}

직접 회전하여 최우해를 찾아내려면 dfs의 성질을 위해 매우 빨리 최우해를 찾아낼 수 있다

좋은 웹페이지 즐겨찾기