作者bleed1979 (十三)
站内Prob_Solve
标题8 queens 之 92种位置
时间Fri Oct 10 23:52:43 2008
今天写ACM Q167时, 看到测资是从1排到64, 突然想到的求92种位置的方法
也许很多人以前就有用了, 也许很多人有更快的做法
不过因为是自己想到的心得 - 7, 8 ,9 奥义, 分享给大家
1 2 3 4 5 6 7 8
9 10 11 12 13 14 15 16
17 18 19 20 21 22 23 24
25 26 27 28 29 30 31 32
33 34 35 36 37 38 39 40
41 42 43 44 45 46 47 48
48 50 51 52 53 54 55 56
57 58 59 60 61 62 63 64
如果在4摆放queen
同一列就不用说了
别列来说, 18, 20, 22都会被吃掉
(18 - 4) % 7 = 0
(18 - 4) / 7 = 3 - 1
两条件同时成立来判断不合法的摆放
奥义 8, 9 是同样道理
所以92种位置的做法就可以用以下2函式来达成
inline bool isSet(const int &p, const int &size, const vector<int> &index)
{
bool isLegal = true;
for(int i = size - 1; i >= 0; --i)
{
int result = (size * 8 + p) - index[i];
if(result % 7 == 0)
{
if(result / 7 == size - i)
{
isLegal = false;
break;
}
}
if(result % 8 == 0)
{
if(result / 8 == size - i)
{
isLegal = false;
break;
}
}
if(result % 9 == 0)
{
if(result / 9 == size - i)
{
isLegal = false;
break;
}
}
}
return isLegal;
}
inline void EightQueensPositions(vector<vector<int> > &p)
{
p.clear();
vector<int> index(8, 0);
//eight queens simulate...
vector<int> q_index(8, 0);
int now_line = 0;
while(true)
{
while(q_index[now_line] == 8)
{
--now_line;
if(now_line < 0) break;
++q_index[now_line];
}
if(now_line < 0) break;
if(isSet(q_index[now_line], now_line, index) == true)
{
index[now_line] = now_line * 8 + q_index[now_line];
++now_line;
if(now_line != 8) q_index[now_line] = 0;
}
else
++q_index[now_line];
if(now_line == 8)
{
p.push_back(index);
--now_line;
++q_index[now_line];
}
}
}
有了这92种摆法的所有位置, 解Q167就可以AC 0.000
Bleed
--
ACM's PARADISE
http://bleed1979.myweb.hinet.net/
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 122.116.16.70
1F:推 LPH66:本来还在想会不会有wraparound问题 10/11 12:04
2F:→ LPH66:没看到已经有/7==size-i确定了 :P 10/11 12:05