Submission #106559


Source Code Expand

//JAG夏合宿13Day2E MagicDoors
#include<vector>
#include<cmath>
#include<map>
#include<cstdlib>
#include<iostream>
#include<sstream>
#include<fstream>
#include<string>
#include<algorithm>
#include<cstring>
#include<cstdio>
#include<set>
#include<stack>
#include<bitset>
#include<functional>
#include<ctime>
#include<queue>
#include<deque>
#include<complex>
using namespace std;
#define pb push_back
#define pf push_front
typedef long long lint;
typedef complex<double> P;
#define mp make_pair
#define fi first
#define se second
typedef pair<int,int> pint;
typedef pair<int,pint> tint;
#define All(s) s.begin(),s.end()
#define rAll(s) s.rbegin(),s.rend()
#define REP(i,a,b) for(int i=a;i<b;i++)
#define rep(i,n) REP(i,0,n)
int dp[32][32][260],d2[32][32][260];
int dx[4]={0,0,1,-1},dy[4]={1,-1,0,0};
string ma[32];
priority_queue <tint> q;
int n,m,inf=1000000000;
void aedge(int t,int x,int y,int p){
	if(dp[x][y][p]<=t) return;
	dp[x][y][p]=t;q.push(mp(-t,mp(x*m+y,p)));
	return;
}
int main()
{
	cin>>n>>m;rep(i,n) cin>>ma[i];
	rep(i,32) rep(j,32) rep(k,260) dp[i][j][k]=d2[i][j][k]=inf;
	rep(i,n) rep(j,m){
		if(ma[i][j]=='^') aedge(0,i,j,0);
	}
	while(q.size()>0){
		tint r=q.top();q.pop();
		int t=-r.fi,x=r.se.fi/m,y=r.se.fi%m,p=r.se.se;
		if(d2[x][y][p]<=t) continue;d2[x][y][p]=t;
		//cout<<t<<' '<<x<<' '<<y<<' '<<p<<endl;
		char c=ma[x][y];
		if(c=='$'){
			cout<<t<<endl;return 0;
		}
		if(c<='h' && c>='a'){
			aedge(t+1+__builtin_popcount(p),x,y,p|(1<<(c-'a')));
		}
		if(c<='H' && c>='A'){
			aedge(t,x,y,(p|(1<<(c-'A')))-(1<<(c-'A')));
		}
		rep(i,4){
			int nx=x+dx[i],ny=y+dy[i];
			if(nx<0 || ny<0 || nx>=n || ny>=m) continue;
			char d=ma[nx][ny];
			if(d=='#') continue;
			if(d<='H' && d>='A'){
				if(!(p&(1<<(d-'A')))) continue;
			}
			aedge(t+1+__builtin_popcount(p),nx,ny,p);
		}
	}
	cout<<-1<<endl;
}

Submission Info

Submission Time
Task E - Magic Doors
User sky58
Language C++ (GCC 4.4.7)
Score 100
Code Size 1906 Byte
Status AC
Exec Time 50 ms
Memory 3124 KB

Judge Result

Set Name All
Score / Max Score 100 / 100
Status
AC × 20
Set Name Test Cases
All 1, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 2, 20, 3, 4, 5, 6, 7, 8, 9
Case Name Status Exec Time Memory
1 AC 46 ms 2976 KB
10 AC 29 ms 3000 KB
11 AC 47 ms 3124 KB
12 AC 50 ms 3092 KB
13 AC 27 ms 2996 KB
14 AC 28 ms 2996 KB
15 AC 27 ms 2992 KB
16 AC 31 ms 3052 KB
17 AC 32 ms 2996 KB
18 AC 31 ms 2984 KB
19 AC 48 ms 3124 KB
2 AC 34 ms 3040 KB
20 AC 28 ms 2996 KB
3 AC 33 ms 2972 KB
4 AC 28 ms 3040 KB
5 AC 30 ms 2984 KB
6 AC 27 ms 2996 KB
7 AC 30 ms 2920 KB
8 AC 34 ms 3048 KB
9 AC 32 ms 2984 KB