我正在为宽度优先搜索算法编写代码。在问题上下文中,节点被定义为8个整数的数组,可以同时具有正数和负数。据说正数是男性,负数据说是女性。两个数字可以跳舞,如果其中一个是男性而另一个是女性,并且它们的绝对值的总和是素数。我必须找到排序数组所需的最短舞蹈数。例如,对于输入1 2 4 -3 5 6 7 8
,答案将是1.因为3可以与2共舞,(因为3是女性而2是男性)并且它们的绝对值的总和是5,这是一个素数。因此,在3为舞蹈后移动到2后,数组变为1 2 -3 4 5 6 7 8
并进行排序。但是我的代码出了问题。我添加了评论,以便更容易阅读。这是我的BFS代码:
//Took input.
queue <array1> q;
q.push(init);
level[init] = 0;
visited[init] = true;
array1 v;
while(!q.empty()){
array1 u = q.front();
q.pop();
/*
We can view that the digits have an empty space on either side of them.
Arr2 represents it as 0 when it is an empty space where a digit can come, or else the digits value (1 - 8)
*/
int arr2[17] = {0};
//Loading the arr2 array.
for(int i = 0; i < 8; i++){
arr2[2*i + 1] = u.arr[i];
}
for(int i = 1; i < 17; i+=2){
for(int j = 0; j < 17; j+=2){
//This condition checks if the digit arr2[i] can move to arr2[j] by satisfying all the condition stated above.
if((j - 1 >= 0 && arr2[i] * arr2[j-1] < 0 && j != i-1 && j != i+1 && is_prime(abs(arr2[j-1])+abs(arr2[i])))
||(j + 1 < 17 && arr2[i] * arr2[j+1] < 0 && j != i - 1 && j != i + 1 && is_prime(abs(arr2[j+1])+abs(arr2[i])))){
//If it can, then swap the values.
swap(arr2[j],arr2[i]);
int l = 0;
for(int k = 0; k < 17; k++){
if(arr2[k] == 0) continue;
v.arr[l++] = arr2[k];
}
// v now holds the new state (or array / node )
if(visited[v] == false){
visited[v] = true;
printf("visited[v]: %d\n",visited[v]); // the error is shown here. It prints visited[v] as 0. But I assigned it as true just before this line. Nothing else happened. Why it is 0?
v.print();
level[v] = level[u] + 1;
q.push(v);
if(v.is_sorted()){
while(!q.empty()) q.pop();
ans = level[v];
i = j = 100000; break;
}
}
}
}
}
}
这是我的array1类:
class array1{
public:
int arr[8];
bool operator < (const array1 & in) const{
for(int i = 0; i < 8; i++){
if(arr[i] < in.arr[i])
return true;
}
return false;
}
bool is_sorted() const{
for(int i = 0; i < 8; i++){
if(i + 1 != abs(arr[i])) return false;
}
return true;
}
void print(){
for(int i = 0; i < 8; i++){
printf("%d ",arr[i]);
}
printf("\n");
}
};
第visited[v] = true
行应该使visited[v]
等于1.但是在下一行中,它会被打印并且值打印为0.
答案 0 :(得分:0)
我找到了问题的解决方案。显然是重载运算符&lt;工作不正常。它没有正确比较。我认为lexigoraphically最小阵列是最短的。所以当我从0到7时,如果我在arr [i]中找到一个大于in.arr [i],arr[i] > in.arr[i]
的值,那么肯定该函数必须返回false。对于此问题,地图无法检索对象,因为它不完美地比较。在我做对了之后,这里是重载的操作符。
bool operator < (const array1 & in) const{
for(int i = 0; i < 8; i++){
if(arr[i] < (in.arr[i]))
return true;
if(arr[i] > in.arr[i]) return false;
}
return false;
}