Untitled

mail@pastecode.io avatar
unknown
plain_text
a month ago
2.8 kB
4
Indexable
Never
#define MAX_SIZE    1000
#include <unordered_map>
#define rint register int
using namespace std;
 
int planeSize;
unordered_map<int, vector<pair<int, int>>> hashMap;
int hashPlane[1009][1009];
 
unsigned long long hashFunc(int arr[][5]) {
    unsigned long long hash = 0;
    for (rint i = 0; i < 5; ++i) {
        for (rint j = 0; j < 5; ++j) {
            hash = (hash * 31 + arr[i][j]) % 1000000007; 
        }
    }
    return hash;
}
 
void rotateMatrix(int(*tile)[5]) {
    for (rint i = 0; i < 5 / 2; i++) {
        for (rint j = i; j < 5 - i - 1; j++) {
            int tmp = tile[i][j];
            tile[i][j] = tile[4 - j][i];
            tile[4 - j][i] = tile[4 - i][4 - j];
            tile[4 - i][4 - j] = tile[j][4 - i];
            tile[j][4 - i] = tmp;
        }
    }
}
 
void init(int N, int mPlane[MAX_SIZE][MAX_SIZE])
{
    hashMap.clear();
    memset(hashPlane, 0, sizeof(hashPlane));
    planeSize = N;
    int tile[5][5];
     
    for(rint i = 0; i < planeSize - 4 ; i++)
    {
        for(rint j = 0; j < planeSize - 4 ; j++)
        {
            if(!hashPlane[i][j])
            {
                int count = 0;
                for (rint x = 0; x < 5; ++x){
                    for (rint y = 0; y < 5; ++y){
                        tile[x][y] = mPlane[i + x][j + y];
                        if (tile[x][y]) count++;
                    }
                }
                if (count == 7)
                {
                    size_t hash_value = 0;
                    for (rint w = 0; w < 4; w++){
                        hash_value = hashFunc(tile);
                        rotateMatrix(tile);
                        if (hashMap[hash_value].size()) break;
                    }
                    if (hash_value != 0)
                    {
                        hashMap[hash_value].push_back(make_pair(i, j));
                        for (rint x = 0; x < 5; ++x) {
                            for (rint y = 0; y < 5; ++y) {
                                hashPlane[i + x][j + y] = hash_value;
                            }
                        }
                    }
                }
            }
        }
    }
}
 
int getCount(int mPiece[5][5])
{
    size_t hash_value = 0;
    for (rint w = 0; w < 4; w++){
        hash_value = hashFunc(mPiece);
        rotateMatrix(mPiece);
        if (hashMap[hash_value].size()) break;
    }
    if (hash_value == 0) return 0;
    return hashMap[hash_value].size();
}
 
int getPosition(int mRow, int mCol)
{
    size_t hash_value = hashPlane[mRow][mCol];
    int row = hashMap[hash_value].front().first + 2;
    int col = hashMap[hash_value].front().second + 2;
    return row * 10000 + col;
}
Leave a Comment