1067. Sort with Swap(0,*) 解析

来源:互联网 发布:kt交易师软件下载 编辑:程序博客网 时间:2024/06/06 17:15

用map做个映射表,映射为-1的时候就是被访问了。我的方法是模拟整个过程

0不参加访问标记,因为0回到自己的位置会有两种情况

1、排序没有完成

2、排序完成

两种情况要分开讨论。

注意再访问是否被访问的时候因为是顺序访问,记录每次访问的终点,下次查询是否访问从那里开始,不然会超时。

#include <iostream>#include <vector>#include <map>#define MAX 100010using namespace std;int n;int list[MAX];int c = 0;int pos = 1;map <int, int> n2r;map <int, int> r2n;void swap(){#ifdef _DEBUGcout << "-------------" << endl;for (int i = 0; i < n; i++) {cout << i << " : " << n2r[i] << endl;}#endifif (n2r[0] != 0) { //0 不在0位 未排序完int p1 = n2r[0]; //0的位置int p2 = n2r[p1]; //0的位置对应的数的位置c++;n2r[0] = p2; n2r[p1] = -1;//清除swap();}else {//0在原点可能排完 也可能没排完bool tag = false;for (int i = pos; i < n; i++) {if (n2r[i] > 0) { //没访问过n2r[0] = i;n2r[list[i]] = 0;tag = true;c++;pos = i;break;}}if (tag == false) {//排序完成cout << c << endl;}elseswap();}}int main() {cin >> n;for (int i = 0; i < n; i++) {scanf("%d", &list[i]);if(list[i] == i && list[i] != 0)//0不参与标记n2r[list[i]] = -1;//在自己的位置不用交换elsen2r[list[i]] = i;}swap();return 0;}





0 0
原创粉丝点击