무림

무림
Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 2408    Accepted Submission(s): 641
Problem Description
12 행 12 열 이 있 는 사각형 의 무림 세계 에서 소림, 무당 과 아 미 3 파 의 제자 들 이 무림 을 독점 하기 위해 서로 싸 우 고 있다.무림 세계 의 첫 번 째 줄 의 한 칸 의 좌 표 는 (1, 1) 이 고, 첫 번 째 줄 의 두 번 째 열 좌 표 는 (1, 2) 이다. 오른쪽 아래 의 좌 표 는 (12, 12) 이다.그림:
소림 파 제 자 는 항상 같은 열 에서 쉬 지 않 고 걷는다.먼저 내 려 가 고 끝까지 가면 안 될 때 위로 올 라 가 고 끝까지 가면 또 내 려 가 고... 예 를 들 어 (1, 1) -> (2, 1) -> (3, 1).
무당 파 제 자 는 항상 같은 줄 을 왔다갔다 한다.먼저 오른쪽으로 가세 요. 끝까지 가면 안 될 때 왼쪽으로 가세 요. 그리고 끝까지 가면 오른쪽으로 가세 요. 예 를 들 어 (2, 1) -> (2, 2) -> (2, 3).
아 미 파 제 자 는 항상 오른쪽 아래 - 왼쪽 위 방향 으로 왔다갔다 하 며 먼저 오른쪽 아래 로 가 고 끝까지 가면 더 이상 갈 수 없 을 때 왼쪽 위로 가 고 끝까지 가면 오른쪽 아래로 간다. 예 를 들 어 (1, 1) -> (2, 2) -> (3, 3).아 미 제자 가 (1, 12) 또는 (12, 1) 에 있다 면 당연히 영원히 움 직 이지 않 을 수 밖 에 없다.
걸 을 때마다 제자 들 은 반드시 한 칸 만 움 직 여야 한다.
모든 제 자 는 내력, 무예, 생명력 세 가지 속성 이 있다.이 세 가지 속성의 수치 범 위 는 모두 0 보다 크 고 100 보다 작다.
서로 다른 문 파 의 제자 두 명 이 같은 칸 에 들 어 갈 때 는 반드시 한 번 의 전투 가 발생 하 며, 이 경우 에 만 전투 가 발생 한다.(같은 파 제자 들 끼 리 는 당연히 서로 잔인하게 죽 이지 않 는 다. 한 칸 에 세 파 제자 가 있 을 때 모두 가 다른 사람의 어부 가 이익 을 얻 을 까 봐 손 을 대지 못 한다. 그리고 여러 명의 같은 파 제자 들 도 손 을 잡 고 적 을 상대 하지 않 는 다. 이것 은 무림 에서 숭상 하 는 단식 정신 에 어 긋 나 고 사람들 에 게 멸시 와 조 소 를 받 을 수 있 기 때문이다)
한 번 의 전투 결 과 는 참전 쌍방의 생명력 에 변 화 를 가 져 올 수 있 으 며, 계산 방법 은 다음 과 같다.
전후 생명력 = 전전 생명력 - 상대 공 격 력
문 파 에 따라 제자 공 격 력 계산 방법 이 다 릅 니 다.
소림 파 공 격 력 = (0.5 * 내력 + 0.5 * 무예) * (전전 생명력 + 10)/100
무당 파 공 격 력 = (0.8 * 내력 + 0.2 * 무예) * (전전 생명력 + 10)/100
아 미 파 공 격 력 = (0.2 * 내력 + 0.8 * 무예) * (전전 생명력 + 10)/100
공 격 력 에 대한 계산 과정 은 부동 소수점 연산 이 고 최종 결 과 는 소수점 을 제거 한 후 부분 을 정돈 하여 공 격 력 을 항상 정수 로 한다.
한 번 의 전투 가 끝나 면 생명력 이 0 보다 작 거나 같은 제자 로 변해 '전사' 로 간주 되 며 무림 에서 사라 진다.
서로 다른 종파 의 제자 두 명 이 만 났 을 때 단 한 번 의 전투 가 벌 어 졌 다.
초기 상태 에서 생명 치가 0 보다 작 거나 같은 제 자 는 존재 하지 않 으 며, 한 칸 에 여러 제자 가 동시에 있 을 수 있 습 니 다.
일련의 전 투 는 초기 상태 에서 폭발 할 수 있 으 며, 모든 전투 가 끝 난 후에 도 살아 있 는 제자 들 이 다음 칸 으로 함께 가기 시작 했다.한 마디 로, 끊임없이 전투 - 걷 기 - 전투 - 걷 기........................................................................
당신 이 해 야 할 일 은 초기 상태 에서 N 보 (N < 1000) 를 거 친 후의 상 태 를 계산 하 는 것 입 니 다.모든 제자 가 먼저 완전 전투 (물론 아무런 전투 도 일어나 지 않 았 을 수도 있 습 니 다) 를 한 다음 에 한꺼번에 다음 칸 으로 가 는 것 을 한 걸음 이 라 고 합 니 다.
모든 제자 총 수 는 1000 을 넘 지 않 습 니 다.
 
Input
첫 번 째 줄 은 테스트 데이터 의 그룹 수 이 고 그 다음은 각 그룹의 테스트 데이터 이다.
각 그룹의 데이터 첫 줄 은 걸음 수 N 이다.
다음 몇 줄 은 각 줄 마다 제자 한 명의 위치 와 각종 매개 변 수 를 설명 합 니 다.제 자 를 묘사 할 때 형식 은 '제자 번호 줄 번호 열 호 내력 무예 생명력' 이다.제자 번 호 는 하나의 자모 이다.
'S' 는 소림 파 제 자 를 대표 한다.
'W' 는 무당 파 제 자 를 대표 한다.
'E' 는 아 미 파 제 자 를 대표 한다.
예 를 들 면:
W 10 2 10 3 10
10 행 2 열 에 무당 파 제자 가 한 명 있 는데 그의 내력 은 10 이 고 무 예 는 3 이 며 생명력 은 10 이다.
각 그룹의 테스트 데 이 터 는 끝 표시 줄 로 끝 납 니 다.끝 표지 줄 에는 한 글자 '0' 만 포함 되 어 있 습 니 다.
 
Output
각 그룹의 테스트 데 이 터 를 대상 으로 당신 의 출력 은 4 줄 이 어야 합 니 다. 앞의 3 줄 은 빈 칸 으로 구 분 된 두 개의 정수 입 니 다. 앞의 하 나 는 특정한 파 제자 총수 이 고, 뒤의 하 나 는 본 파 의 모든 제자 생명력 의 합 입 니 다.1 행 은 소림 파, 2 행 은 무당 파, 3 행 은 아 미 파 를 대표 하도록 규정 하고 있다.네 번 째 줄 은 '* *' 로 끝 을 나타 낸다.
 
Sample Input
2
1
S 1 2 20 20 20
W 2 1 20 20 20
0
2
S 1 2 20 20 20
W 2 1 20 20 20
E 12 12 20 20 100
0
 
Sample Output
1 20
1 20
0 0
***
1 14
1 14
1 100
***
이것 은 내 가 HDU 에서 본 가장 큰 시 뮬 레이 션 문제 로 제목 의 뜻 을 이해 하기 어렵 지 않다.구조 체 와 함수 체 를 이용 하여 시스템 을 비교 하고 각 문 파 의 걷 는 방식 을 각각 함수 로 설정 합 니 다.이 문 제 는 하룻밤 에 오전 을 더 한 이 유 는 그 작은 버그 를 찾기 위해 서 였 다.고 맙 게 도 AC.
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
struct node
{
   char name;
   int x,y;
   int power,guofu,HP;
   int direction;
   int life;
}a[2000];//        
struct nodeb
{
   int Ncode[2000];
   int num;
}flag[13][13];//  
void ShaoLin(int i)//       
{
   if(a[i].direction==1)
   {
       if(a[i].x<12)
       {
          a[i].x++;
          flag[a[i].x][a[i].y].num++;
          flag[a[i].x-1][a[i].y].num--;
          flag[a[i].x][a[i].y].Ncode[flag[a[i].x][a[i].y].num-1]=i;
       }
       else
       {
           a[i].x--;
           a[i].direction=-1;
           flag[a[i].x][a[i].y].num++;
           flag[a[i].x+1][a[i].y].num--;
           flag[a[i].x][a[i].y].Ncode[flag[a[i].x][a[i].y].num-1]=i;
       }
   }
   else
   {
      if(a[i].x>1)
       {
          a[i].x--;
          flag[a[i].x][a[i].y].num++;
          flag[a[i].x+1][a[i].y].num--;
          flag[a[i].x][a[i].y].Ncode[flag[a[i].x][a[i].y].num-1]=i;
       }
       else
       {
           a[i].x++;
           a[i].direction=1;
           flag[a[i].x][a[i].y].num++;
           flag[a[i].x-1][a[i].y].num--;
           flag[a[i].x][a[i].y].Ncode[flag[a[i].x][a[i].y].num-1]=i; 
       }
   }
}
void WuDang(int i)//       
{
   if(a[i].direction==1)
   {
       if(a[i].y<12)
       {
          a[i].y++;
          flag[a[i].x][a[i].y].num++;
          flag[a[i].x][a[i].y-1].num--;
          flag[a[i].x][a[i].y].Ncode[flag[a[i].x][a[i].y].num-1]=i; 
       }
       else
       {
           a[i].y--;
           a[i].direction=-1;
           flag[a[i].x][a[i].y].num++;
           flag[a[i].x][a[i].y+1].num--;
           flag[a[i].x][a[i].y].Ncode[flag[a[i].x][a[i].y].num-1]=i; 
       }
   }
   else
   {
      if(a[i].y>1)
       {
          a[i].y--;
          flag[a[i].x][a[i].y].num++;
          flag[a[i].x][a[i].y+1].num--;
          flag[a[i].x][a[i].y].Ncode[flag[a[i].x][a[i].y].num-1]=i; 
       }
       else
       {
           a[i].y++;
           a[i].direction=1;
           flag[a[i].x][a[i].y].num++;
           flag[a[i].x][a[i].y-1].num--;
           flag[a[i].x][a[i].y].Ncode[flag[a[i].x][a[i].y].num-1]=i; 
       } 
   }
}
void EMei(int i)//        (1,12) (12,1),         
{
   if(a[i].direction==1)
   {
       if(a[i].x<12&&a[i].y<12)
       {
          a[i].x++;a[i].y++;
          flag[a[i].x][a[i].y].num++;
          flag[a[i].x-1][a[i].y-1].num--;
          flag[a[i].x][a[i].y].Ncode[flag[a[i].x][a[i].y].num-1]=i; 
       }
       else
       {
           if(a[i].x-1>=1&&a[i].y-1>=1)
           {
               a[i].x--;a[i].y--;
               a[i].direction=-1;
               flag[a[i].x][a[i].y].num++;
               flag[a[i].x+1][a[i].y+1].num--;
               flag[a[i].x][a[i].y].Ncode[flag[a[i].x][a[i].y].num-1]=i;
           }
       }
   }
   else
   {
      if(a[i].x>1&&a[i].y>1)
       {
          a[i].x--;a[i].y--;
          flag[a[i].x][a[i].y].num++;
          flag[a[i].x+1][a[i].y+1].num--;
          flag[a[i].x][a[i].y].Ncode[flag[a[i].x][a[i].y].num-1]=i;
       }
       else
       {
           if(a[i].x+1<=12&&a[i].y+1<=12)
           {
               a[i].x++;a[i].y++;
               a[i].direction=1;
               flag[a[i].x][a[i].y].num++;
               flag[a[i].x-1][a[i].y-1].num--;
               flag[a[i].x][a[i].y].Ncode[flag[a[i].x][a[i].y].num-1]=i;
           }
       } 
   }
}
void Fight()//    
{
     int i,j;
     int n,m,tank1,tank2;
     for(i=1;i<=12;i++)
     {
        for(j=1;j<=12;j++)
        {
           if(flag[i][j].num==2)
           {
              n=flag[i][j].Ncode[0];
              m=flag[i][j].Ncode[1];
              if(a[n].name!=a[m].name&&a[n].life==1&&a[m].life==1)
              {
                  if(a[n].name=='S')
                  tank1=(int)((0.5*a[n].power+0.5*a[n].guofu)*(a[n].HP+10)/100);
                  else if(a[n].name=='W')
                  tank1=(int)((0.8*a[n].power+0.2*a[n].guofu)*(a[n].HP+10)/100);
                  else if(a[n].name=='E')
                  tank1=(int)((0.2*a[n].power+0.8*a[n].guofu)*(a[n].HP+10)/100);
                  if(a[m].name=='S')
                  tank2=(int)((0.5*a[m].power+0.5*a[m].guofu)*(a[m].HP+10)/100);
                  else if(a[m].name=='W')
                  tank2=(int)((0.8*a[m].power+0.2*a[m].guofu)*(a[m].HP+10)/100);
                  else if(a[m].name=='E')
                  tank2=(int)((0.2*a[m].power+0.8*a[m].guofu)*(a[m].HP+10)/100);
                  a[n].HP=a[n].HP-tank2;
                  a[m].HP=a[m].HP-tank1;
                  if(a[n].HP<=0) a[n].life=-1;
                  if(a[m].HP<=0) a[m].life=-1;
              }
           }
        }
     }
}
int main()
{
    int i,j,n,m,k;
    char sign;
    scanf("%d",&n);
    while(n--)
    {
        for(i=0;i<13;i++)
        {
           for(j=0;j<13;j++)
           {flag[i][j].num=0;}
        }
        scanf("%d",&m);
        i=0;
        getchar();
        while(scanf("%c",&sign)!=EOF)
        {
           if(sign=='0')
           {break;}
           else
           {
              a[i].name=sign;
              a[i].direction=1;
              a[i].life=1;    
              scanf("%d %d %d %d %d",&a[i].x,&a[i].y,&a[i].power,&a[i].guofu,&a[i].HP);
              if(a[i].name=='E')
              {
                 if(a[i].x==1&&a[i].y==12)
                 {
                    flag[a[i].x][a[i].y].num++;
                    flag[a[i].x][a[i].y].Ncode[flag[a[i].x][a[i].y].num-1]=i;
                 }else 
                 if(a[i].x==12&&a[i].y==1)
                 {
                    flag[a[i].x][a[i].y].num++;
                    flag[a[i].x][a[i].y].Ncode[flag[a[i].x][a[i].y].num-1]=i;    
                 }
              }
              i++;
           }
           getchar();
        }
        k=i;
        while(m--)
        {
           Fight();
           for(i=0;i<k;i++)
           {
              if(a[i].name=='S')
              {ShaoLin(i);}
              else
              if(a[i].name=='W')
              {WuDang(i);}
              else
              if(a[i].name=='E')
              {EMei(i);}
           }
        }  
        int sums1=0,sumw1=0,sume1=0;
        int sums2=0,sumw2=0,sume2=0;
        for(i=0;i<k;i++)
        {
           if(a[i].name=='S'&&a[i].HP>0)
           {sums1++;sums2+=a[i].HP;}
           else
           if(a[i].name=='W'&&a[i].HP>0)
           {sumw1++;sumw2+=a[i].HP;}
           else
           if(a[i].name=='E'&&a[i].HP>0)
           {sume1++;sume2+=a[i].HP;}
        } 
        printf("%d %d
",sums1,sums2); printf("%d %d
",sumw1,sumw2); printf("%d %d
",sume1,sume2); printf("***
"); } system("pause"); return 0; }

좋은 웹페이지 즐겨찾기