將棋盤上的棋子變成一行,計算最小步數。

題目:棋盤上分佈着n個棋子,棋子的座標爲(x,y)。將各個棋子變成一行,相同的點只能放一個棋子。計算將這些棋子變成一行,棋子每步可以上下左右移動一格,計算最少需要多少步。

輸入:第一輸入n,表示棋子的數量。

接下來的n行輸入棋子的座標。

示例1:

輸入:

3

1 0

2 4

3 2

輸出:

4

示例2

輸入:

3

1 5

1 6

1 1

輸出:

8

#include <iostream>
#include <algorithm>
using namespace std;
const int N = 10000;
int a[N];
int b[N];
int Count[N];
int main()
{
	int n;
	cin >> n;
	int stand = 0;
	int num = 0;
	for (int i = 0; i < n; i++)
	{
		cin >> a[i] >> b[i];
	}
	for (int i = 0; i < n; i++)
	{
		Count[a[i]]++;
		stand += b[i];
	}
	stand = (float)stand / n+0.5;
	for (int i = 0; i < n; i++)
	{
		if (Count[a[i]] == 1)
		{
			num += abs(stand - b[i]);
		}
		else if(Count[a[i]]>=2)
		{
			int k, j;
			for (k = a[i] - 1, j = a[i] + 1; k > a[i] - N, j < a[i] + N; k--, j++)
			{
				if (Count[k] == 0)
				{
					num = num + abs(stand - b[i]) + abs(a[i] - k);
					Count[k]++;
					//cout << "(" << k << "," << stand << ")" << endl;
					break;
				}
				else if (Count[j] == 0) 
				{
					num = num + abs(stand - b[i]) + abs(a[i] - j);
					Count[j]++;
					//cout << "(" << j << "," << stand << ")" << endl;
					break;
				}
			}
			Count[a[i]]--;
		}
		cout << num << " ";
	}
	cout << endl;
	cout << num;
	return 0;
}

結果顯示:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章