병사 대열 훈련 문제

3082 단어 C
병사 대열 훈련 문제
Time Limit : 2000/1000ms (Java/Other)   Memory Limit : 65536/32768K (Java/Other)
Total Submission(s) :    Accepted Submission(s) : 
Problem Description
모 부 대 는 신병 대열 훈련 을 실시 하여 신병 을 처음부터 순서대로 번 호 를 매 겨 횡대 로 나란히 세 웠 다. 훈련의 규칙 은 다음 과 같다. 처음부터 1 부터 2 까지 번호, 2 까지 번호, 나머지 는 작은 번호 방향 으로 접근 한 다음 에 처음부터 1 부터 3 까지 번호, 3 까지 번호, 나머지 는 작은 번호 방향 으로 접근 했다.계속 처음부터 1 부터 2 까지 번호...이후 처음부터 1 ∼ 2 번, 1 ∼ 3 번 을 돌아 가면 서 나머지 인원 이 3 명 을 넘 지 않 을 때 까지 진행한다.
 
 
Input
이 문 제 는 여러 테스트 데이터 팀 이 있 으 며, 첫 번 째 행동 팀 은 N 행 신병 수 이 고, 이 어 N 행 신병 수 이 며, 신병 수 는 5000 을 넘 지 않 는 다.
 
 
Output
입력 한 신병 수 에 대응 하 는 N 줄 이 있 고, 줄 마다 남 은 신병 의 최초 번 호 를 출력 하 며, 번호 사이 에 빈 칸 이 있 습 니 다.
 
 
Sample Input
22040
 
 
Sample Output
1 7 19
1 19 37
신병 번호: 1, 2, 3... n
다음 규칙:
1. 1, 2 번 숫자 를 보고 하고 2 번 째 열 에 보고 합 니 다.다음 번호: 2, 4, 6..., 나머지 번호: 1, 3, 5...
2. 남 은 신병 은 1, 2, 3 번 에 보고 하고 3 번 에 보고 합 니 다.출 열 번호: 5, 11,..., 나머지 번호 1, 3, 7, 9...
3. 상기 과정 을 남 은 인원수 < = 3 까지 반복 합 니 다.
주요 사고방식:
체인 워 치
step 1: 정렬 or 역순 으로 건설 표를 만 들 고 신병 번호 매기 기
step 2: 신병 num < = 3 시: 출력 링크
            그렇지 않 으 면:
             a. 첫 번 째: 하나, 둘 번 째 번 째 번 호 를 옮 겨 다 니 며 모든 번 호 를 삭제 합 니 다.(count: 2 or 3 에 보고 하 는 표지 입 니 다. i: 계수).
             b. 처음 을 옮 겨 다 니 면 num < = 3 의 성립 여 부 를 판단 해 야 합 니 다. 성립: 끝.성립 되 지 않 음: 번호 표 지 를 바 꾸 고 포인터 가 출발점 으로 돌아 갑 니 다.
             c. 두 번 째: 하나, 둘, 셋 번 째 번 호 를 옮 겨 다 니 며 3 번 째 번 호 를 삭제 합 니 다.             
step 3: b 조건 이 성립 될 때 까지 step 2 를 반복 합 니 다.결말 이 나쁘다.
step 4: 출력 링크
주: 순환 조건 은 while (num > 3) 일 수 없습니다.
#include
#include

typedef struct LNode
{
	int data;
	struct LNode *next;
}LNode, *LinkList;

LinkList CreateList_L(int num) //     
{
	LinkList L, pt;
	L = (LinkList)malloc(sizeof(LNode));
	L->next = NULL;
	for (int i = num; i > 0; i--) //      
	{
		pt = (LinkList)malloc(sizeof(LNode));
		pt->data = i;
		pt->next = L->next;
		L->next = pt;
	}
	return L;
}

LinkList operate(LinkList &L, int num) //  
{
	int count = 2, i = 1;
	LinkList pt;
	pt = L;
	while (true)
	{
		if (pt->next)
		{
			if (i == count)
			{
				pt->next = pt->next->next;//  
				num--;
			}
			else
			{
				pt = pt->next;
			}
			i = i%count + 1; //           
		}
		else if (num <= 3)
		{
			break;
		}
		else
		{
			i = 1;
			count = 5 - count;
			pt = L;//    
		}

	}
	return L;
}
void Print(LinkList L) //  
{
	LinkList pt;
	pt = L->next;
	if (pt)
	{
		do
		{
			if (pt->next == NULL)
			{
				printf("%d", pt->data);
			}
			else
				printf("%d ", pt->data);
			pt = pt->next;
		} while (pt);
	}
}

int main()
{
	int n;
	scanf("%d", &n);
	while (n--)
	{
		int num;
		LinkList L;
		scanf("%d", &num);
		L = CreateList_L(num);
		if (num <= 3)
		{
			Print(L);
			printf("
"); } else { L = operate(L, num); Print(L); printf("
"); } } return 0; }

좋은 웹페이지 즐겨찾기