HDU 6341 DFS搜索

思路比較簡單,就是對於十六個區域逐個搜索它旋轉了多少次,因爲只有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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章