U E D R , A S I H C RSS

Stacks Of Flapjacks/��현

소�

간단할듯 하여 �전했는� 역시;;
해법� �단 0~n 까지 케� 중 가장 � 케� 바로뒤� 주걱� 꼽고 한번 뒤집어 가장 � 케�� 맨 위� 오게한 후 다시 flip(1)로 뒤집어 가장 � 케�� 맨 아래 n� 오게한다.
그 다�엔 0~n-1 까지 케�� 가지고 ��한 �작� 반복하고.. �렇게 최고 n번정�만 하면 팬케�� 작�것부터 �것까지 정렬�다.

시간 대부분� 입력받는것 짜는� 매달렸으나 아�� 입력부분� 문제�서 요구한대로 완성하지 못했다.
여러줄 입력받는걸 만들기 힘들어 ì�¼ë‹¨ 그냥 한줄 입력받고 ê²°ê³¼ìœë ¥ 하는 ì‹�으로 했다.

코드


~cpp 
//Stacks Of Flapjacks:2005.04.15 ��현
#include <iostream>
using namespace std;

class StacksOfFlapjacks{
private:
	int* cake;	//케��들
	int arr_size;	//케� 개수
	void flip(int n){	//n번�다가 주걱 넣고 뒤집어!
		int k = (arr_size-n+1)/2;
		for(int i=0; i<k; i++){
			swap(cake[i],cake[arr_size-n-i]);
		}
		cout << n << " ";
	}
	int searchBigIndex(int end){	//0~end index까지 검사하여 가장 � 수� index리턴.
		int big_index=0;
		for(int i=1;i<=end;i++){
			if(cake[big_index]<cake[i])
				big_index = i;
		}
		return big_index;
	}
	bool isEnd(){	//모든숫�가 정렬�었는지 확�.
		for(int i=1;i<arr_size;i++){
			if(cake[i-1]>cake[i])
				return false;
		}
		cout << "0\n";	//모든케ì�µì�´ ì •ë ¬ë�˜ì—ˆìœ¼ë¯€ë¡œ ë�”ì�´ìƒ� 뒤집ì�„게없다는 0ìœë ¥
		return true;
	}
public:
	void run(int*arr, int size){	
		cake = arr;
		arr_size = size;
		for(int j=arr_size-1, n=1;j>=0;j--, n++){	
			if(isEnd()==true)
				break;
			if(searchBigIndex(j)==j)	//제� � 케�� 놓��리� �미 놓여있다면 다�뒤집기로.
				continue;		
			if(searchBigIndex(j)!=0)	//맨위� 제��케�� 있으면 뒤집� 필요가 없다.
				flip(arr_size-searchBigIndex(j));
			flip(n);			
		}		
	}
};

int main(void){	
	StacksOfFlapjacks sof;
	int arr[30],j=0;	
	while(cin >> arr[j]){	//입력� �� ^Z(EOF)를 �내내서 종료.				
		j++;
                  if(j>30) break;
	}
	for(int i=0;i<j;i++)
		cout << arr[i] << " ";
	cout << "\n";
	sof.run(arr,j);		
	for(i=0;i<j;i++)
		cout << arr[i] << " ";	
	return 0;
}
Valid XHTML 1.0! Valid CSS! powered by MoniWiki
last modified 2021-02-07 05:28:06
Processing time 0.0038 sec