무림
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;
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
C 언어 구현 천둥 제거 게임 상세 정보먼저 작은 메뉴를 표시하고 게임을 할지 여부를 선택하십시오.사용자가 종료를 선택하면 프로그램 실행이 끝나고, 사용자가 게임을 선택하면 지뢰 제거 위치 좌표를 입력하라는 메시지가 표시됩니다.사용자가 입력한 좌표가 바둑...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.