广度优先遍历算法

时间:2016-04-14 02:01:30

标签: c++ breadth-first-search

对于给定的n,我试图找到可被n整除的最小数字,并且还将数字之和作为n。

例如:对于n = 10,输出应为190,对于n = 11,输出应为209

我采用了广度优先遍历方法来解决我的问题。

#include <iostream> 
#include <queue>
#include <string>
using namespace std;

class State{
    public:
        int sum,rem;
        string str;
        State(int s,int r,string st){
            sum = s;
            rem = r;
            str = st;
        }
};

int main() {
    int n,newSum,newRem;
    queue<State> q;
    cin>>n;
    bool visited[n+1][n+1] = {0};
    State curr = State(0,0,"");
    q.push(curr);
    visited[0][0] = 1;
    while(!q.empty()){
        curr = q.front();
        q.pop();
        if(curr.sum==n && curr.rem==0){
            cout<<curr.str<<endl;
            break;
        }
        for(int j=0; j<=9; j++){
            newSum = curr.sum + j;
            newRem = (curr.rem*10+j)%n;

            if(newSum > n){
                break;
            }

            else if(!visited[newSum][newRem]){
                curr = State(curr.sum+j, ((curr.rem*10)+j)%n,curr.str+to_string(j));
                q.push(curr);
                visited[newSum][newRem] = 1;
            }
        }
    }
    return 0;
}

我的代码返回一个满足条件的数字,但它不是最小的数字。 对于n = 10,我的代码给出了12340 对于n = 11,我的代码给出1010207

Ideone链接:http://ideone.com/c4W48N

1 个答案:

答案 0 :(得分:0)

您应该尝试使用调试器,它会很快显示问题。

在这一行:

curr = State(curr.sum+j, ((curr.rem*10)+j)%n,curr.str+to_string(j));
q.push(curr);

您正在为curr变量分配一个新值,然后在循环中使用该变量。这意味着不是尝试1,2,3等,而是尝试1,12,123等。

您还在重新计算刚刚计算过的项目。

您可以将其替换为

State newState = State(newSum, newRem, curr.str + to_string(j));
q.push(newState);

或更简单地说:

q.push(State(newSum, newRem, curr.str+to_string(j)));