果然开始工作了就没多少时间了呢。。。
熟悉环境 + 学新知识。 某些东西还是不要丢下的好……
果然开始工作了就没多少时间了呢。。。
熟悉环境 + 学新知识。 某些东西还是不要丢下的好……
好吧好久没写,果然变懒了 = = 简略点好了
N x N 方阵,左上角入,左下角出,只能上下左右相邻移动,每格仅访问一次遍历所有格,求遍历方法数。
暴力 + 剪枝,没想出什么别的方法。最多就位运算优化一下:
Test 1: TEST OK [0.000 secs, 2900 KB] Test 2: TEST OK [0.000 secs, 2900 KB] Test 3: TEST OK [0.000 secs, 2900 KB] Test 4: TEST OK [0.000 secs, 2900 KB] Test 5: TEST OK [0.000 secs, 2900 KB] Test 6: TEST OK [0.000 secs, 2900 KB] Test 7: TEST OK [0.162 secs, 2900 KB] All tests OK.
N = 7 的时候在 0.162 秒貌似还不错,嗯。
代码嘛……算了不贴了。在 wordpress 上贴代码各种麻烦。研究一下再说
Welcome to WordPress.com. This is your first post. Edit or delete it and start blogging!
至少先把列表保存一下 = =
虽然也好久没更新了
这个挺搞笑的,TCP三次握手也不顶用
看了下对标准库多了个 <codecvt> 的头文件,终于从 iostream 实现了对 UTF8 UTF16LE UTF16BE 的转码支持,大概前一段我试验的那几个 codecvt_facet 也到时候了吧。不过具体效果如何(性能问题比较难说)还是等拿到再具体判断为好。
右值引用也加入标准库,然后多了个 forward_list 的单链表,几个新的 algorithm 函数,智能指针等
就我感觉类似 <codecvt> 应是 C++ 标准库很需要添加的内容,虽然公司的效率还是比较快,可是等着 C++ 标准委员会整好新标准还不知得等到猴年马月去。每次想到标准库里面的查找函数命名乱得一塌糊涂,就感觉那些个人工作效率真是低的要死。
class farm{
int cnt, cowat[16], cowleft[5];
bool nochange[16];
unsigned long long ajtcnt[5];
const unsigned long long mask, maskl, maskr;
pair<int, int> putorder[16];
int dfscow[16], dfspos[16];
void addcow(int cowidx, int posidx){
switch(posidx){
/*
0 1 2 3
4 5 6 7
8 9 10 11
12 13 14 15
*/
case 0:
case 4:
ajtcnt[cowidx] += maskl >> (5 - posidx) * 4;
break;
case 3:
ajtcnt[cowidx] += maskr >> (5 - posidx) * 4;
break;
case 1:
case 2:
ajtcnt[cowidx] += mask >> (5 - posidx) * 4;
break;
case 5:
case 6:
case 9:
case 10:
case 13:
case 14:
ajtcnt[cowidx] += mask << (posidx - 5) * 4;
break;
case 8:
case 12:
ajtcnt[cowidx] += maskl << (posidx - 5) * 4;
break;
case 7:
case 11:
case 15:
ajtcnt[cowidx] += maskr << (posidx - 5) * 4;
break;
}
cowat[posidx] = cowidx;
}
int replace(int newcow, int posidx){
int oldcow = cowat[posidx];
unsigned long long m;
switch(posidx){
case 0:
case 4:
m = maskl >> (5 - posidx) * 4;
ajtcnt[newcow] += m;
ajtcnt[oldcow] -= m;
break;
case 3:
m = maskr >> (5 - posidx) * 4;
ajtcnt[newcow] += m;
ajtcnt[oldcow] -= m;
break;
case 1:
case 2:
m = mask >> (5 - posidx) * 4;
ajtcnt[newcow] += m;
ajtcnt[oldcow] -= m;
break;
case 5:
case 6:
case 9:
case 10:
case 13:
case 14:
m = mask << (posidx - 5) * 4;
ajtcnt[newcow] += m;
ajtcnt[oldcow] -= m;
break;
case 8:
case 12:
m = maskl << (posidx - 5) * 4;
ajtcnt[newcow] += m;
ajtcnt[oldcow] -= m;
break;
case 7:
case 11:
case 15:
m = maskr << (posidx - 5) * 4;
ajtcnt[newcow] += m;
ajtcnt[oldcow] -= m;
break;
}
cowat[posidx] = newcow;
return oldcow;
}
bool putable(int cowidx, int posidx) const {
return !((ajtcnt[cowidx] >> posidx*4) & 0xF);
}
void dfs(int idx){
int oldcow;
if(idx == 16){
if(!(cnt++)){
for(int i = 0; i < 16; ++i)
putorder[i] = make_pair(dfscow[i], dfspos[i]);
}
return;
}
int &cow(dfscow[idx]), &pos(dfspos[idx]);
for(cow = 0; cow < 5; ++cow)if(cowleft[cow]){
–cowleft[cow];
for(pos = 0; pos < 16; ++pos)if(nochange[pos] && putable(cow, pos)){
nochange[pos] = false;
oldcow = replace(cow, pos);
dfs(idx + 1);
replace(oldcow, pos);
nochange[pos] = true;
}
++cowleft[cow];
}
}
public:
template<class Iter>
farm(Iter beg, Iter end): cnt(0), mask (0×011101110111ULL),
maskl(0×011001100110ULL), maskr(0×001100110011ULL){
fill_n(ajtcnt, 5, 0);
fill_n(cowleft, 5, 3);
fill_n(nochange, 16, true);
for(int i=0; beg != end; ++beg, ++i)
addcow(*beg - ‘A’, i);
}
void calput(void){
int oldcow, &pos(dfspos[0]);
dfscow[0] = 3;
for(pos = 0; pos < 16; ++pos)if(putable(3, pos)){
nochange[pos] = false;
oldcow = replace(3, pos);
dfs(1);
replace(oldcow, pos);
nochange[pos] = true;
}
}
ostream& output(ostream& os){
for(int i=0; i<16; ++i){
div_t pos = div(putorder[i].second, 4);
os << char(putorder[i].first + ‘A’) << ‘ ‘
<< pos.quot + 1 << ‘ ‘ << pos.rem + 1 << ‘\n’;
}
os << cnt << ‘\n’;
return os;
}
};
int main(){
ifstream fin("wissqu.in");
farm wissqu((istream_iterator<char>(fin)), istream_iterator<char>());
fin.close();
ofstream fout("wissqu.out");
wissqu.calput();
wissqu.output(fout);
fout.close();
}