思路比較簡單,就是對於十六個區域逐個搜索它旋轉了多少次,因爲只有16個大格所以複雜度不會太大。
#include <iostream>
#include <math.h>
#include <iomanip>
#include <string>
#include <cstdio>
#include <stdio.h>
#include <cstring>
#include <algorithm>
#include <queue>
#include <vector>
#define INF 0x3f3f3f3f
#define N 17
#define M 998244353
#define ll long long
using namespace std;
int cnt = 0;
int ans = INF;
char e[N][N],g[N][N];
bool vis[300];
int cishu[N][N];
void rotate(int a,int b){
int i1,j1,i2,j2;
for(i1 = a * 4 - 3,j2 = b*4; i1 <= a*4; i1++,j2--){
for(j1 = b * 4 - 3,i2 = a*4-3; j1 <= b*4; j1++,i2++){
g[i2][j2] = e[i1][j1];
}
}
for(i1 = a * 4 - 3; i1 <= a*4; i1++){
for(j1 = b * 4 - 3; j1 <= b*4; j1++){
e[i1][j1] = g[i1][j1];
}
}
}
bool check(int a,int b){
for(int i=a*4-3;i<=a*4;i++){
memset(vis,0,sizeof(vis));
for(int j=1;j<=b*4;j++){
if(vis[e[i][j]]){
return 0;
}else{
vis[e[i][j]] = 1;
}
}
}
for(int j = 4*b-3;j<=4*b;j++){
memset(vis,0,sizeof(vis));
for(int i=1;i<=a*4;i++){
if(vis[e[i][j]]){
return 0;
}else{
vis[e[i][j]] = 1;
}
}
}
return 1;
}
void dfs(int a,int b){
for(int i=0;i<4;i++){
rotate(a,b);
cnt++;
if(i == 3){
cnt -= 4;
}
if(check(a,b)){
if(b == 4){
if(a == 4){
ans = min(cnt,ans);
}else{
dfs(a+1,1);
}
}else{
dfs(a,b+1);
}
}
}
}
int t;
int main() {
int i,j;
scanf("%d",&t);
while (t>0)
{
t--;
ans = INF;
cnt = 0;
for(i=1;i<=16;i++){
getchar();
for(j=1;j<=16;j++){
scanf("%c",&e[i][j]);
}
}
dfs(1,1);
printf("%d\n",ans);
}
return 0;
}