[위 키 오 이] 1041 Car 의 여행 코스.
3474 단어 IO
알고리즘: 최 단 로 (데이터 가 약 하고 Floyd 도 통과 할 수 있 습 니 다)
뼈 아 픈 교훈: 이 문 제 를 적어도 20 번 은 제출 했 습 니 다. 그 이 유 는 = 너무 경솔 하고 부주의 하기 때 문 입 니 다. 그 몇 조 의 데 이 터 를 보고 도시 의 수량 이 라 고 생각 하여 배열 이 작 게 열 렸 습 니 다.(미안 하 다, 위 키 오 이의 평가 기 = =).운행 오 류 를 계속 보고 하 다.나 는 뜻밖에도 줄곧 경 계 를 넘 었 다 는 것 을 알 아내 지 못 했다.
기억 하기: 데이터 범 위 를 잘 봐 야 지 아아 아!!!!!
이 문제 에서 가장 징 그 러 운 것 은 네 번 째 노드 를 처리 하 는 것 이다. 처음에 나 는 네 번 째 점 (본인 은 33951 점, 33979 점) 을 어떻게 계산 해 야 할 지 몰 랐 다. 단순 한 x4 = x1 + x2 - x3 이면 지나 갈 수 있다 고 생각 했다.근 데 안 돼.뒤에 문 제 를 봤 는데 직각 변 종점 x1, y1 과 x2, y2 일 거 예요.그 러 니까 어느 쪽 이 직각 변 인지 판단 해 야 돼.
하면, 만약, 만약... (x1 - x2) * (x3 - x2) + (y1 - y2) * (y3 - y2) = 0, 그러면 L1 은 88692 입 니 다.
아 픈 코드:
#include <iostream>
#include <algorithm>
#include <cstring>
#include <iomanip>
#include <cmath>
using namespace std;
const double oo = 10000000;
// (x-1)*4+1 x
#define CTOA(x) (((x-1)<<2)+1)
//
#define DISTANCE(x1,y1,x2,y2) ((double)sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2)))
// FLOYD , ,
// , A B
struct city
{
int x[4], y[4];
}ct[105];
double node[4050][4050];
double T;
int s, t, A, B, N, i, j, k, l, temp, airport, tx[3], ty[3];
// , , , AB、BC 。
// , A、B、C B、C、A, , AB、BC , 。
// , AB BC , , 。
//(1) :
// , , 。
// L1、L2, (x1-x2)*(x3-x2)+(y1-y2)*(y3-y2)=0, L1 ⊥ L2。
//(2) (x4,y4):
// x4-x3=x1-x2 x4=x1-x2+x3, y4=y1-y2+y3
void getfour(int c) //
{
memcpy(tx, ct[c].x, sizeof(tx));
memcpy(ty, ct[c].y, sizeof(ty));
int tt;
while((tx[0]-tx[1])*(tx[2]-tx[1])+(ty[0]-ty[1])*(ty[2]-ty[1]))
{
tt = tx[0]; tx[0]=tx[1]; tx[1]=tx[2]; tx[2]=tt;
tt = ty[0]; ty[0]=ty[1]; ty[1]=ty[2]; ty[2]=tt;
}
ct[c].x[3] = tx[0]-tx[1]+tx[2];
ct[c].y[3] = ty[0]-ty[1]+ty[2];}
int main()
{
cin >> N;
while(N--)
{
cin >> s >> t >> A >> B;
// A=B , , ‘0.0’;
if(A == B) {cout << "0.0
";continue;}
//s<<2 , s*4
airport = s << 2;
for(i = 1; i <= airport; i++)
for(j = 1; j <= airport; j++)
node[i][j] = oo; //
for(i = 1; i <= s; i++)
{
for(j = 0; j < 3; j++)
cin >> ct[i].x[j] >> ct[i].y[j];
cin >> T;
getfour(i);
//
for(j = 0; j < 4; j++)
for(k = 0; k < 4; k++)
if(j != k)
node[CTOA(i)+j][CTOA(i)+k] = DISTANCE(ct[i].x[j], ct[i].y[j], ct[i].x[k], ct[i].y[k]) * T;
}
//
for(i = 1; i <= s; i++)
for(j = 1; j <= s; j++)
if(i != j)
for(k = 0; k < 4; k++)
for(l = 0; l < 4; l++)
node[CTOA(i)+k][CTOA(j)+l] = (DISTANCE(ct[i].x[k], ct[i].y[k], ct[j].x[l], ct[j].y[l]) * t);
//Floyd
for(k = 1; k <= airport; k++)
for(i = 1; i <= airport; i++)
for(j = 1; j <= airport; j++)
node[i][j] = min(node[i][j], node[i][k]+node[k][j]);
//A B
double ans = oo;
for(i = 0; i < 4; i++)
for(j = 0; j < 4; j++)
ans = min(ans, node[CTOA(A)+i][CTOA(B)+j]);
cout << setiosflags(ios::fixed) << setprecision(1) << ans << endl;
}
return 0;
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
java 입출력 I/O스트림(stream) 자바에서 입출력을 수행하려면 두 대상을 연결하고 데이터를 전송할 수 있는 무언가가 필요한데 이것을 스트림(stream)이라고 정의했다. 스트림은 단방향 통신만 가능하기 때문에 하나의 스트림으로 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.