找符合条件的数

编程之美2.8节。大略看了一下作者的解答。作者的解法有点动态规划的套路。这里尝试用广搜的办法来求解。在我们做乘法时,最低位的数字决定于乘数的最低位,而与乘数的高位无关。广搜的策略就是从低到高逐位尝试,直到找到结果。注意下面的代码中vis数组的使用。这个数组可以使广搜树得到有效剪枝。本来STL中vector<bool>的特化是被很多人批评的一件事,这里却恰是我想要的结果,不仅速度快,还可以有效节省空间。

 
  
struct Item {
int v;
string s;
Item(
int vv, const string & ss): v(vv), s(ss) {}
};

bool bfs( int v, string & s) {
while ( ! (v % 10 )) v /= 10 ;

vector
< bool > vis(v, false );
queue
< Item > q;
for ( int i = 1 ; i <= 9 ; ++ i) {
int p = v * i;
if (p % 10 <= 1 )
q.push(Item(p
/ 10 , string () + ( char )(i + ' 0 ' )));
}

while ( ! q.empty()) {
Item item
= q.front();
q.pop();

if ( ! item.v) {
s
= item.s;
break ;
}

if (vis[item.v]) continue ;
vis[item.v]
= true ;

if (item.v % 10 <= 1 )
q.push(Item(item.v
/ 10 , item.s + ' 0 ' ));

for ( int i = 1 ; i <= 9 ; ++ i) {
int p = v * i + item.v;
if (p % 10 <= 1 )
q.push(Item(p
/ 10 , item.s + ( char )(i + ' 0 ' )));
}
}

size_t len
= s.length();
for (; len > 0 && s[len - 1 ] == ' 0 ' ; -- len);
s.resize(len,
0 );
reverse(s.begin(), s.end());
return ! s.empty();
}

int main() {
int v;
while (cin >> v) {
string s;
bfs(v, s);
cout
<< s << ' \n ' ;
}
return 0 ;
}

转载于:https://www.cnblogs.com/acmaru/archive/2011/04/04/2005166.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值