Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 基于二维关系数组对数组进行排序(高、低、无关紧要)_C++_Arrays_Algorithm_Sorting - Fatal编程技术网

C++ 基于二维关系数组对数组进行排序(高、低、无关紧要)

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

我已经被这个问题困扰了两天,但我仍然不能把它解决好

基本上,我有一个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
我的目标是创建一个给定数字(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
的信息,因此它们应该放在输出中的哪个位置?我不太理解您的问题,您能进一步澄清吗