1001: http://paste.ubuntu.com/12612561/
- 添加评论
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;
}
不是暴力枚举k序列,是最小表示法。
暴力AC无压力
其实算了下把旋转留到最后一步,之前只做分成的4个块的整体旋转似乎能过?= =
可惜最后来不及提交了......
= =发现这样比2L大神的还优个几十倍的常数...悲伤QAQ
暴力模拟
我擦咧= =还真是暴力枚举?我以为是要求出一个矩阵来实现旋转。。。然后通过快速幂去判断。。。
我暴力40分就T了,姿势太不好
最后一题题目怎么说就怎么写咯~算是模拟题么
暴力就可以吗?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; }
跪mathlover大神! 是大神真身吗?
如假包换...
花样ORZ大神
感觉跟前两个月CF上的判断两个字符串经过某些变换是否相等一个思路?(然而码力渣渣并不能一下子写出来。趴)求赛后开放题目T T