제6 장 연습 문제 - 3 - 무림 - 2785

#include <iostream>
#include <stdio.h>
#include <string>
#include <string.h>
#include <vector>
#include <list>
#include <math.h>
#include <algorithm>

using namespace std;

typedef struct Hero
{
	int x;
	int y;
	int a;
	int b;
	int c;
	bool live;
	bool dir;//   true,   false
}Hero;

int searchNum(int x , int y , Hero *h, int *p )
{
	int i , num = 0 ;
	for( i = 0 ; h[i].x!='\0' ; i++ )
	{
		if( h[i].x == x && h[i].y == y && h[i].live == true )
		{
			num++;
			*p = i;
		}
	}
	return num;
}

void MoveS(Hero *h)
{
	int i;
	for( i = 0 ; h[i].x!='\0' ; i++ )
	{
		if( h[i].live )
		{
			if( h[i].dir )
			{
				if( h[i].x < 12 ) h[i].x ++ ;
				else if( h[i].x == 12 )
				{
					h[i].dir = false;
					h[i].x = 11;
				}
			}
			else
			{
				if( h[i].x > 1 ) h[i].x -- ;
				else if( h[i].x == 1 )
				{
					h[i].dir = true;
					h[i].x = 2;
				}
			}
		}
	}
}

void MoveW(Hero *h)
{
	int i;
	for( i = 0 ; h[i].x!='\0' ; i++ )
	{
		if( h[i].live )
		{
			if( h[i].dir )
			{
				if( h[i].y < 12 ) h[i].y ++ ;
				else if( h[i].y == 12 )
				{
					h[i].dir = false;
					h[i].y = 11;
				}
			}
			else
			{
				if( h[i].y > 1 ) h[i].y -- ;
				else if( h[i].y == 1 )
				{
					h[i].dir = true;
					h[i].y = 2;
				}
			}
		}
	}
}

void MoveE(Hero *h)
{
	int i;
	for( i = 0 ; h[i].x!='\0' ; i++ )
	{
		if( h[i].x==1 && h[i].y==12 )continue;
		if( h[i].x==12 && h[i].y==1 )continue;
		if( h[i].live )
		{
			if( h[i].dir )
			{
				if( h[i].x < 12 && h[i].y < 12 )
				{
					h[i].x++;
					h[i].y++;
				}
				else
				{
					h[i].dir = false;
					h[i].x--;
					h[i].y--;
				}
			}
			else
			{
				if( h[i].x > 1 && h[i].y > 1 )
				{
					h[i].x--;
					h[i].y--;
				}
				else
				{
					h[i].dir = true;
					h[i].x++;
					h[i].y++;
				}
			}
		}
	}
}

int main()
{
	int n, step, i , j;
	int sp, wp, ep;//        
	int num_s, num_w, num_e ;//                
	char pai;
	Hero s[1001],w[1001],e[1001];

	scanf("%d",&n);
	
	while(n--)
	{
		scanf("%d", &step);
		sp = wp = ep = 0 ;
		while( scanf("%c",&pai) && pai != '0' )
		{
			switch(pai)
			{
				case 'S':
					scanf("%d %d %d %d %d",&s[sp].x, &s[sp].y, &s[sp].a, &s[sp].b, &s[sp].c );
					s[sp].live = true;
					s[sp].dir = true;
					sp ++;
					break;
				case 'W':
					scanf("%d %d %d %d %d",&w[wp].x, &w[wp].y, &w[wp].a, &w[wp].b, &w[wp].c );
					w[wp].live = true;
					w[wp].dir = true;
					wp ++;
					break;
				case 'E':
					scanf("%d %d %d %d %d",&e[ep].x, &e[ep].y, &e[ep].a, &e[ep].b, &e[ep].c );
					e[ep].live = true;
					w[wp].dir = true;
					ep ++;
					break;
			}
		}
		s[sp].x = w[wp].x = e[ep].x = '\0';
		while(step--)
		{
			//          
			for( i = 1 ; i <= 12 ; i ++ )
				for( j = 1 ; j <= 12 ; j ++ )
				{
					num_s = searchNum( i , j , s , &sp );//sp               
					num_w = searchNum( i , j , w , &wp );
					num_e = searchNum( i , j , e , &ep );

					int attack1 , attack2 ;

					if( num_s == 1 && num_w == 1 && num_e == 0 )//      
					{
						//  sp    
						attack1 = (int)((0.5*(double)s[sp].a + 0.5*(double)s[sp].b)*((double)s[sp].c+10) / (double)100);
						//  wp    
						attack2 = (int)((0.8*(double)w[wp].a + 0.2*(double)w[wp].b)*((double)w[wp].c+10) / (double)100);
						//  sp,wp     
						s[sp].c -= attack2;
						w[wp].c -= attack1;
						//      
						if( s[sp].c <= 0 ) s[sp].live = false;
						if( w[wp].c <= 0 ) w[wp].live = false;
					}
					else if( num_s == 1 && num_w == 0 && num_e == 1 )//      
					{
						//  sp    
						attack1 = (int)((0.5*(double)s[sp].a + 0.5*(double)s[sp].b)*((double)s[sp].c+10) / (double)100);
						//  wp    
						attack2 = (int)((0.2*(double)e[ep].a + 0.8*(double)e[ep].b)*((double)e[ep].c+10) / (double)100);
						//  sp,wp     
						s[sp].c -= attack2;
						e[ep].c -= attack1;
						//      
						if( s[sp].c <= 0 ) s[sp].live = false;
						if( e[ep].c <= 0 ) e[ep].live = false;
					}
					else if( num_s == 0 && num_w == 1 && num_e == 1 )//      
					{
						//  sp    
						attack1 = (int)((0.2*(double)e[ep].a + 0.8*(double)e[ep].b)*((double)e[ep].c+10) / (double)100);
						//  wp    
						attack2 = (int)((0.8*(double)w[wp].a + 0.2*(double)w[wp].b)*((double)w[wp].c+10) / (double)100);
						//  sp,wp     
						e[ep].c -= attack2;
						w[wp].c -= attack1;
						//      
						if( e[ep].c <= 0 ) e[ep].live = false;
						if( w[wp].c <= 0 ) w[wp].live = false;
					}
				}
			//      
			MoveS(s);
			MoveW(w);
			MoveE(e);
		}
		//vitality
		int attack;
		num_s = attack = 0;
		for( i = 0 ; s[i].x != '\0' ; i++ )
		{
			if(s[i].live)
			{
				num_s++;
				attack += s[i].c ;
			}
		}
		printf("%d %d
",num_s,attack); num_s = attack = 0; for( i = 0 ; w[i].x != '\0' ; i++ ) { if(w[i].live) { num_s++; attack += w[i].c ; } } printf("%d %d
",num_s,attack); num_s = attack = 0; for( i = 0 ; e[i].x != '\0' ; i++ ) { if(e[i].live) { num_s++; attack += e[i].c ; } } printf("%d %d
***
",num_s,attack); } return 1; }

이렇게 많은 코드 에 놀 라 지 마 세 요. 이 문 제 는 어 려 운 알고리즘 과 관련 되 지 않 습 니 다. 전투 과정 을 잘 고려 하고 세부 사항 에 주의 하면 됩 니 다.
좌표, 내력, 무예, 전투력, 생존 여부, 이동 방향 등 3 파 제자 들 의 정 보 를 구조 체 로 저장 합 니 다.
주요 시 뮬 레이 션 다음 과정:
① 12 * 12 개의 칸 을 스 캔 하고 칸 당 소림, 무당, 아미제 자의 개 수 는 2 개 1 개 0 의 경우 에 만 싸움 이 발생 한다.
② 전투 중 쌍방의 전투력 을 계산 하여 전후 생명력 을 계산 하고 전사 여 부 를 판단 한다.
③ 각 파 의 살 아 있 는 제 자 는 규칙 에 따라 이동한다.

좋은 웹페이지 즐겨찾기