85分求助
查看原帖
85分求助
1057897
Redl1ght_S楼主2024/9/22 10:22
#include <bits/stdc++.h>
#include <bits/extc++.h>
using namespace std;
typedef long long ll;
int n, res=7;
char stt[15][15], tgt[15][15];

void solution_check(int cas){
	char temp[15][15], temp2[15][15];
    if(cas == 1){
        // turn 90 degrees
		for(register int i=1; i<=n; ++i)
            for(register int j=1; j<=n; ++j)
                temp[j][n-i+1] = stt[i][j];
        bool flag = true;
        for(register int i=1; i<=n; ++i)
            for(register int j=1; j<=n; ++j)
                if(temp[i][j] != tgt[i][j])
                    flag = false;
        if(flag)
            res = min(res, 1);
    }else if(cas == 2){
        // turn 180 degrees
  		for(register int i=1; i<=n; ++i)
            for(register int j=1; j<=n; ++j)
                temp[n-i+1][n-j+1] = stt[i][j];
        bool flag = true;
        for(register int i=1; i<=n; ++i)
            for(register int j=1; j<=n; ++j)
                if(temp[i][j] != tgt[i][j])
                    flag = false;
        if(flag)
            res = min(res, 2);
    }else if(cas == 3){
        // turn 270 degrees
  		for(register int i=1; i<=n; ++i)
            for(register int j=1; j<=n; ++j)
                temp[n-j+1][i] = stt[i][j];
        bool flag = true;
        for(register int i=1; i<=n; ++i)
            for(register int j=1; j<=n; ++j)
                if(temp[i][j] != tgt[i][j])
                    flag = false;
        if(flag)
            res = min(res, 2);
    }else if(cas == 4){
        // reflection
		for(register int i=1; i<=n; ++i)
            for(register int j=1; j<=n; ++j)
                temp[i][n-j+1] = stt[i][j];
        bool flag = true;
        for(register int i=1; i<=n; ++i)
            for(register int j=1; j<=n; ++j)
                if(temp[i][j] != tgt[i][j])
                    flag = false;
        if(flag)
            res = min(res, 2);
    }else if(cas == 5){
    	bool flag;
        // combination
		for(register int i=1; i<=n; ++i)
            for(register int j=1; j<=n; ++j)
                temp[i][n-j+1] = stt[i][j];
        /* cas 4+1*/
		for(register int i=1; i<=n; ++i)
            for(register int j=1; j<=n; ++j)
                temp2[j][n-i+1] = temp[i][j];
        flag = true;
        for(register int i=1; i<=n; ++i)
            for(register int j=1; j<=n; ++j)
                if(temp2[i][j] != tgt[i][j])
                    flag = false;
        if(flag)
            res = min(res, 5);
		/*cas 4+2*/
		for(register int i=1; i<=n; ++i)
            for(register int j=1; j<=n; ++j)
                temp2[n-i+1][n-j+1] = temp[i][j];
        flag = true;
        for(register int i=1; i<=n; ++i)
            for(register int j=1; j<=n; ++j)
                if(temp2[i][j] != tgt[i][j])
                    flag = false;
        if(flag)
            res = min(res, 5);
		/*cas 4+3*/
		for(register int i=1; i<=n; ++i)
            for(register int j=1; j<=n; ++j)
                temp2[n-j+1][i] = temp[i][j];
        flag = true;
        for(register int i=1; i<=n; ++i)
            for(register int j=1; j<=n; ++j)
                if(temp2[i][j] != tgt[i][j])
                    flag = false;
        if(flag)
            res = min(res, 5);
    }else if(cas == 6){
        bool flag = true;
        // nothing-changed
        for(register int i=1; i<=n; ++i)
            for(register int j=1; j<=n; ++j)
                if(stt[i][j] != tgt[i][j])
                    flag = false;
        if(flag)
            res = min(res, 6);
    }
    return;
}

int main(void){
    cin >> n;
    for(register int i=1; i<=n; ++i)
        for(register int j=1; j<=n; ++j)
            cin >> stt[i][j];
    for(register int i=1; i<=n; ++i)
        for(register int j=1; j<=n; ++j)
            cin >> tgt[i][j];
    for(int i=1; i<=6; ++i)
        solution_check(i);
    cout << res << "\n";
    return 0;
}
2024/9/22 10:22
加载中...