C++ 基于二维关系数组对数组进行排序(高、低、无关紧要)
我已经被这个问题困扰了两天,但我仍然不能把它解决好 基本上,我有一个2D数组,其中某些数字之间有关系(在给定范围内):C++ 基于二维关系数组对数组进行排序(高、低、无关紧要),c++,arrays,algorithm,sorting,C++,Arrays,Algorithm,Sorting,我已经被这个问题困扰了两天,但我仍然不能把它解决好 基本上,我有一个2D数组,其中某些数字之间有关系(在给定范围内): 0=顺序无关紧要 1=第一个数字(左列中的数字)应为第一个 2=第二个数字(上排数字)应为第一个 我有一些2D数组,例如: 0 1 2 3 4 5 6 0 0 0 1 0 0 0 2 1 0 0 2 0 0 0 0 2 2 1 0 0 1 0 0 3 0 0 0 0 0 0 0 4 0 0 2 0 0 0 0 5 0 0 0 0 0 0 0 6 1 0 0 0 0 0
- 0=顺序无关紧要
- 1=第一个数字(左列中的数字)应为第一个
- 2=第二个数字(上排数字)应为第一个
0 1 2 3 4 5 6
0 0 0 1 0 0 0 2
1 0 0 2 0 0 0 0
2 2 1 0 0 1 0 0
3 0 0 0 0 0 0 0
4 0 0 2 0 0 0 0
5 0 0 0 0 0 0 0
6 1 0 0 0 0 0 0
我的目标是创建一个给定数字(0-6)的新数组,它遵循2D数组的规则(例如,0在2之前,但在6之后)。我可能还需要检查这样的数组是否存在,然后创建数组。然后得到这样的结果:
6 0 2 1 4 5
我的代码
(这并不重要,但我更喜欢c++)
到目前为止,我试图从有序数组0123456
开始,然后根据表交换元素(但这显然不起作用)。我还试着根据表格将数字插入另一个数字的前面,但似乎也不起作用
//我的代码示例
//我有:
//relArr[n][n]-关系数组
//resArr={1,2,…,n}-结果数组
对于(int i=0;iiI){
tmp=resArr[iX];
resArr[iX]=resArr[iI];
而(插入>iI-1){
int tt=重新抑制[插入];
resArr[插入]=tmp;
tmp=tt;
插入--;
}
}
}
}
}
我可能错过了检查是否可以创建数组的正确方法。如果您喜欢,可以随意使用向量
提前感谢您的帮助。您似乎在读取输入的同时对输出重新排序。我认为应该将输入解析为一组规则,稍微处理一下规则,然后在最后对输出重新排序
问题的制约因素是什么?如果输入显示
0
在1
之前:
| 0 1
--+----
0 | 1
1 |
它是否也保证它会说1
在0
之后
| 0 1
--+----
0 |
1 | 2
如果是这样,您可以忽略2
s,只查看1
s:
| 0 1 2 3 4 5 6
--+--------------
0 | 1
1 |
2 | 1 1
3 |
4 |
5 |
6 | 1
通过读取输入,我将存储一个规则列表。我会用
std::vector
来做这个。它有一个很好的特性,yourPair。第一个在yourPair之前。第二个:)
如果第二个值永远不是其他规则的第一个值,则可以放弃任何规则
0 before 2
6 before 0
然后需要对该列表进行排序,以确保“…在x之前”和“x在…”之前”按该顺序排列
6 before 0
0 before 2
然后将6
、0
和2
移动到列表的前面0123456
,得到6021345
这有帮助吗?您似乎在读取输入的同时对输出重新排序。我认为应该将输入解析为一组规则,稍微处理一下规则,然后在最后对输出重新排序
问题的制约因素是什么?如果输入显示0
在1
之前:
| 0 1
--+----
0 | 1
1 |
它是否也保证它会说1
在0
之后
| 0 1
--+----
0 |
1 | 2
如果是这样,您可以忽略2
s,只查看1
s:
| 0 1 2 3 4 5 6
--+--------------
0 | 1
1 |
2 | 1 1
3 |
4 |
5 |
6 | 1
通过读取输入,我将存储一个规则列表。我会用std::vector
来做这个。它有一个很好的特性,yourPair。第一个在yourPair之前。第二个:)
如果第二个值永远不是其他规则的第一个值,则可以放弃任何规则
0 before 2
6 before 0
然后需要对该列表进行排序,以确保“…在x之前”和“x在…”之前”按该顺序排列
6 before 0
0 before 2
然后将6
、0
和2
移动到列表的前面0123456
,得到6021345
这有用吗?谢谢你的建议
正如所建议的,在2D数组中只有一个1
是重要的。我用它们来创建有向边的向量,然后实现拓扑排序。我决定用这个。它基本上是拓扑排序,但也检查循环
这成功地解决了我的问题。谢谢你的建议
正如所建议的,在2D数组中只有一个1
是重要的。我用它们来创建有向边的向量,然后实现拓扑排序。我决定用这个。它基本上是拓扑排序,但也检查循环
这成功地解决了我的问题。如上所述,无法防止输入冲突或输入不完整。在您给出的示例中,没有关于3
或5
的信息,因此它们应该放在输出中的哪个位置?我不太理解您的问题,您能进一步澄清吗