1001 1002 1003的AC代码。。。跪求1004满分姿势

6 answer(s)

0

include

include

using namespace std; int mat1[100][100]; int mat2[100][100]; //当n为奇数或者2时,判断矩阵A(最左上角的坐标为i, j)能否通过顺时针旋转得到矩阵B(最左上角的坐标为p,q) bool ifEncry(int n, int i, int j, int p, int q) { vector t; for (int a=p; a

//0度
int cnt = 0, flag = 1;
for (int a=i; a<i+n&&flag; a++) {
    for (int b=j; b<j+n; b++) {
        if (mat1[a][b]!=t[cnt++]) {
            flag = 0;
            break;
        }
    }
}
if (flag) {
    return true;
}

//90度
cnt = 0, flag = 1;
for (int a=j; a<j+n&&flag; a++) {
    for (int b=i+n-1; b>=i; b--) {
        if (mat1[b][a]!=t[cnt++]) {
            flag = 0;
            break;
        }
    }
}
if (flag) {
    return true;
}

//180度
cnt = 0, flag = 1;
for (int a=i+n-1; a>=i&&flag; a--) {
    for (int b=j+n-1; b>=j; b--) {
        if (mat1[a][b]!=t[cnt++]) {
            flag = 0;
            break;
        }
    }
}
if (flag) {
    return true;
}
//270度
cnt = 0, flag = 1;
for (int a=j+n-1; a>=j&&flag; a--) {
    for (int b=i; b<i+n; b++) {
        if (mat1[b][a]!=t[cnt++]) {
            flag = 0;
            break;
        }
    }
}
if (flag) {
    return true;
}

return false;

} bool helper(int n, int i, int j, int p, int q) { if (n%2||n==2) { return ifEncry(n, i, j, p, q); } int m = n/2; if (helper(m, i, j, p, q)&&helper(m, i, j+m, p, q+m)&&helper(m, i+m, j, p+m, q)&&helper(m, i+m, j+m, p+m, q+m)) { return true; } if (helper(m, i, j, p, q+m)&&helper(m, i, j+m, p+m, q+m)&&helper(m, i+m, j, p, q)&&helper(m, i+m, j+m, p+m, q)) { return true; } if (helper(m, i, j, p+m, q+m)&&helper(m, i, j+m, p+m, q)&&helper(m, i+m, j, p, q+m)&&helper(m, i+m, j+m, p, q)) { return true; } if (helper(m, i, j, p+m, q)&&helper(m, i, j+m, p, q)&&helper(m, i+m, j, p+m, q+m)&&helper(m, i+m, j+m, p, q+m)) { return true; } return false;

} int main() {

int T, n;
cin >> T;
for (int i=0; i<T; i++) {
    cin >> n;
    for (int j=0; j<n; j++) {
        for (int k=0; k<n; k++) {
            cin >> mat1[j][k];
        }
    }
    for (int j=0; j<n; j++) {
        for (int k=0; k<n; k++) {
            cin >> mat2[j][k];
        }
    }
    if (helper(n, 0, 0, 0, 0))
        cout << "Yes" << endl;
    else
        cout << "No" << endl;
}
return 0;

}

0

不是暴力枚举k序列,是最小表示法。

  • 感觉跟前两个月CF上的判断两个字符串经过某些变换是否相等一个思路?(然而码力渣渣并不能一下子写出来。趴)求赛后开放题目T T

  • 暴力AC无压力

  • 添加评论
  • reply
0

其实算了下把旋转留到最后一步,之前只做分成的4个块的整体旋转似乎能过?= =

可惜最后来不及提交了......

  • = =发现这样比2L大神的还优个几十倍的常数...悲伤QAQ

  • 添加评论
  • reply
0

暴力模拟

  • 我擦咧= =还真是暴力枚举?我以为是要求出一个矩阵来实现旋转。。。然后通过快速幂去判断。。。

  • 我暴力40分就T了,姿势太不好

  • 添加评论
  • reply
0

最后一题题目怎么说就怎么写咯~算是模拟题么

  • 暴力就可以吗?QvQ 赛后DEBUG成功然而不知道会不会T。。。有什么要注意的地方木?

  • 不会是暴搜k的序列吧。。。。。64一个k 32,4个k,16,16个k,8,64个k,4,256个k。。2,1024个k。。。怎么枚举啊。。。

  • 就是题目怎么说怎么写啊,纯暴力。时间复杂度我也担心爆,但是最后没爆~ 这个时间复杂度感觉挺难分析的,估计用到数学期望去搞吧-= - bool encrypt(int a[][N],int b[][N],int x,int y,int n){ for (int k=0;k<=3;k++){ if(n&1){ if (same(a,b,x,y,n))return 1; }else{ int m=n>>1; if (encrypt(a,b,x,y,m)&&encrypt(a,b,x+m,y,m)&&encrypt(a,b,x,y+m,m)&&encrypt(a,b,x+m,y+m,m)) return 1; } rotate(a,x,y,n); } return 0; }

  • 添加评论
  • reply
0

跪mathlover大神! 是大神真身吗?

write answer 切换为英文 切换为中文


转发分享