Submission #70790

#TimeUsernameProblemLanguageResultExecution timeMemory
70790imsifileAquatic Labyrinth (FXCUP3_aqua)C++98
100 / 100
1505 ms288472 KiB
#include<stdio.h>
#include<vector>
#include<queue>
using namespace std;

typedef long long lld;

struct dd {
	int ix; lld v;
	dd(int ix_, lld v_){ ix=ix_, v=v_; }
	bool operator< (const dd& c) const {
		return v>c.v;
	}
};

int N, nod[910][910], vcn, st, en;
char mz[910][910];
vector<int> con[3010101], val[3010101];
priority_queue<dd> pq;
lld dist[3010101];

int sq(int a){ return a*a; }

void edge(int s, int e, lld v){
	con[s].push_back(e), val[s].push_back(v);
}

int main(){
	scanf("%d", &N);
	for(int i=0; i<N; i++){
		scanf("\n%s", mz[i]);
		for(int j=0; j<N; j++){
			if(mz[i][j]=='W') continue;
			if(mz[i][j]=='M') st=vcn;
			if(mz[i][j]=='H') en=vcn;
			nod[i][j]=vcn++;
		}
	}
	for(int i=0; i<N; i++){
		for(int j=0; j<N; j++){
			if(!j || mz[i][j]!='W') continue;
			int j2;
			for(j2=j; j2<N && mz[i][j2]=='W'; j2++);
			if(j2==N) break;
			j2--;
			for(int k=j-1; k>=0 && mz[i][k]!='W'; k--){
				edge(nod[i][k], vcn, sq(j2-j+1));
				edge(vcn+1, nod[i][k], 0);
			}
			for(int k=j2+1; k<N && mz[i][k]!='W'; k++){
				edge(nod[i][k], vcn+1, sq(j2-j+1));
				edge(vcn, nod[i][k], 0);
			}
			vcn+=2;
			j=j2;
		}
		for(int j=0; j<N; j++){
			if(!j || mz[j][i]!='W') continue;
			int j2;
			for(j2=j; j2<N && mz[j2][i]=='W'; j2++);
			if(j2==N) break;
			j2--;
			for(int k=j-1; k>=0 && mz[k][i]!='W'; k--){
				edge(nod[k][i], vcn, sq(j2-j+1));
				edge(vcn+1, nod[k][i], 0);
			}
			for(int k=j2+1; k<N && mz[k][i]!='W'; k++){
				edge(nod[k][i], vcn+1, sq(j2-j+1));
				edge(vcn, nod[k][i], 0);
			}
			vcn+=2;
			j=j2;
		}
	}
	for(int i=0; i<vcn; i++) dist[i]=-1;
	dist[st]=0, pq.push(dd(st,0));
	while(!pq.empty()){
		dd x=pq.top(); pq.pop();
		if(x.v != dist[x.ix]) continue;
		int s=x.ix;
		for(int i=con[s].size(); i--;){
			int e=con[s][i]; lld v=val[s][i];
			if(dist[e]<0 || dist[e]>x.v+v) dist[e]=x.v+v, pq.push(dd(e,x.v+v));
		}
	}
	printf("%lld\n", dist[en]);
	return 0;
}

Compilation message (stderr)

aqua.cpp: In function 'int main()':
aqua.cpp:29:7: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  scanf("%d", &N);
  ~~~~~^~~~~~~~~~
aqua.cpp:31:8: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   scanf("\n%s", mz[i]);
   ~~~~~^~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...