bool isOK(mat m) { vector<mat> vm, vmnew; set<vector<int> > sv; vm.push_back(m); mat newm; for(int i = 0; i < 32; ++i) { pat[i].data[0][0] = m.data[0][0]; pat[i].data[0][2] = m.data[0][m.n - 1]; pat[i].data[2][0] = m.data[m.n - 1][0]; pat[i].data[2][2] = m.data[m.n - 1][m.n - 1]; } for(int i = m.n; i > 3; i -= 2) { while(!vm.empty()) { m.copy(vm.back()); vm.pop_back(); for(int j = 0; j < 32; ++j) { if(!directSub(newm, m, pat[j])) continue; vector<int> vv = convert(newm); if(sv.find(vv) == sv.end()) { sv.insert(vv); vmnew.push_back(newm); } } } vm = vmnew; vmnew.clear(); sv.clear(); } if(vm.empty()) return false; else return true; }