求助
查看原帖
求助
402384
orgn楼主2022/1/15 23:41

用Dijkstra写的~~(有大病)~~

#include <bits/stdc++.h>
using namespace std;
#define inf 0x7fffffff
int h, w, mat[35][35];
int tx, ty, die, dx, dy, vel[35][35];
int dir[4][2] = {{0, 1}, {0, -1}, {-1, 0}, {1, 0}};
bool vir[35][35];
struct node {
	int ti, tj, velue, fx; //横 纵 花费 方向
	operator< ( const node & up ) const {
		return up.velue < velue;
	}
};
priority_queue<node> q;
bool ok ( int x, int y ) {
	return x >= 1 && x <= h && y >= 1 && y <= w && mat[x][y] != 0;
}
void val1 ( int ax, int ay, int bx, int by, int qw ) {
	if ( vel[bx][by] + qw < vel[ax][ay] ) vel[ax][ay] = vel[bx][by] + qw;
	if ( qw == 0 ) q.push ( {ax, ay, vel[ax][ay], 1} );
	if ( qw == 1 ) q.push ( {ax, ay, vel[ax][ay], 3} );
	if ( qw == 5 ) q.push ( {ax, ay, vel[ax][ay], 4} );
}
void val2 ( int ax, int ay, int bx, int by, int qw ) {
	if ( vel[bx][by] + qw < vel[ax][ay] ) vel[ax][ay] = vel[bx][by] + qw;
	if ( qw == 0 ) q.push ( {ax, ay, vel[ax][ay], 2} );
	if ( qw == 1 ) q.push ( {ax, ay, vel[ax][ay], 4} );
	if ( qw == 5 ) q.push ( {ax, ay, vel[ax][ay], 3} );
}
void val3 ( int ax, int ay, int bx, int by, int qw ) {
	if ( vel[bx][by] + qw < vel[ax][ay] ) vel[ax][ay] = vel[bx][by] + qw;
	if ( qw == 0 ) q.push ( {ax, ay, vel[ax][ay], 3} );
	if ( qw == 1 ) q.push ( {ax, ay, vel[ax][ay], 2} );
	if ( qw == 5 ) q.push ( {ax, ay, vel[ax][ay], 1} );
}
void val4 ( int ax, int ay, int bx, int by, int qw ) {
	if ( vel[bx][by] + qw < vel[ax][ay] ) vel[ax][ay] = vel[bx][by] + qw;
	if ( qw == 0 ) q.push ( {ax, ay, vel[ax][ay], 4} );
	if ( qw == 1 ) q.push ( {ax, ay, vel[ax][ay], 1} );
	if ( qw == 5 ) q.push ( {ax, ay, vel[ax][ay], 2} );
}
void dij() {
	memset ( vel, inf, sizeof ( vel ) );
	memset ( vir, false, sizeof ( vir ) );
	vel[tx][ty] = 0;
	q.push ( { tx, ty, 0, die } );
	while ( q.size() ) {
		node x = q.top();
		q.pop();
		if ( vir[x.ti][x.tj] ) continue;
		vir[x.ti][x.tj] = true;
		
		for ( int i = 0; i < 4; i++ ) {
			int sx = x.ti + dir[i][0], sy = x.tj + dir[i][1];
			if ( !ok ( sx, sy ) ) continue;
			switch ( x.fx ) {
			case 1:
				if ( sx == x.ti ) {
					if ( sy == x.tj - 1 ) val1 ( sx, sy, x.ti, x.tj, 1 );
					if ( sy == x.tj + 1 ) val1 ( sx, sy, x.ti, x.tj, 5 );
				}
				if ( sx == x.ti + 1 ) val1 ( sx, sy, x.ti, x.tj, 0 );
				break;
			case 2:
				if ( sx == x.ti ) {
					if ( sy == x.tj - 1 ) val2 ( sx, sy, x.ti, x.tj, 5 );
					if ( sy == x.tj + 1 ) val2 ( sx, sy, x.ti, x.tj, 1 );
				}
				if ( sx == x.ti - 1 ) val2 ( sx, sy, x.ti, x.tj, 0 );
				break;
			case 3:
				if ( sy == x.tj ) {
					if ( sx == x.ti - 1 ) val3 ( sx, sy, x.ti, x.tj, 1 );
					if ( sx == x.ti + 1 ) val3 ( sx, sy, x.ti, x.tj, 5 );
				}
				if ( sy == x.tj - 1 ) val3 ( sx, sy, x.ti, x.tj, 0 );
				break;
			case 4:
				if ( sy == x.tj ) {
					if ( sx == x.ti - 1 ) val4 ( sx, sy, x.ti, x.tj, 5 );
					if ( sx == x.ti + 1 ) val4 ( sx, sy, x.ti, x.tj, 1 );
				}
				if ( sy == x.tj + 1 ) val4 ( sx, sy, x.ti, x.tj, 0 );
				break;
			}
		}
	}
}
int main () {
	cin >> h >> w;
	for ( int i = 1; i <= h; i++ ) {
		for ( int j = 1; j <= w; j++ ) {
			char t; cin >> t;
			if ( t == '.' ) mat[i][j] = 0;
			if ( t == '#' ) mat[i][j] = 1;
			if ( t == 'E' ) mat[i][j] = 2, tx = i, ty = j, die = 1;
			if ( t == 'W' ) mat[i][j] = 2, tx = i, ty = j, die = 2;
			if ( t == 'N' ) mat[i][j] = 2, tx = i, ty = j, die = 3;
			if ( t == 'S' ) mat[i][j] = 2, tx = i, ty = j, die = 4;
			if ( t == 'F' ) mat[i][j] = 3, dx = i, dy = j;
		}
	}
	dij();
	cout << vel[dx][dy] << endl;
	return 0;
}
2022/1/15 23:41
加载中...