結果
| 問題 | No.20 砂漠のオアシス | 
| コンテスト | |
| ユーザー |  | 
| 提出日時 | 2016-03-07 03:10:00 | 
| 言語 | C++11(廃止可能性あり) (gcc 13.3.0) | 
| 結果 | 
                                AC
                                 
                             | 
| 実行時間 | 33 ms / 5,000 ms | 
| コード長 | 1,742 bytes | 
| コンパイル時間 | 1,423 ms | 
| コンパイル使用メモリ | 166,816 KB | 
| 実行使用メモリ | 6,820 KB | 
| 最終ジャッジ日時 | 2024-10-13 05:33:14 | 
| 合計ジャッジ時間 | 2,288 ms | 
| ジャッジサーバーID (参考情報) | judge5 / judge4 | 
(要ログイン)
| ファイルパターン | 結果 | 
|---|---|
| other | AC * 21 | 
ソースコード
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
#define rep(i,n) for(i=0;i<n;++i)
#define each(itr,c) for(__typeof(c.begin()) itr=c.begin(); itr!=c.end(); ++itr)
#define mp make_pair
#define pb push_back
#define fi first
#define sc second
const int INF=10000000;
int dx[4]={1,-1,0,0}, dy[4]={0,0,1,-1};
typedef pair<int,int> pi;
int main()
{
	int i,j;
	int n,v,ox,oy;
	int f[201][201]={0};
	cin >>n >>v >>ox >>oy;
	rep(i,n)rep(j,n) cin>>f[i+1][j+1];
	bool valid=false;
	string ans="NO";
	//たどりつくまでに消費する体力の最小値を計算
	//オアシスを無視して、とりあえず行けるか
	int d[201][201];
	fill(d[0],d[201],INF);
	d[1][1]=0;
	queue<pi> que;
	que.push(pi(1,1));
	while(!que.empty())
	{
		pi p=que.front();
		que.pop();
		rep(i,4)
		{
			int nx=p.fi+dx[i], ny=p.sc+dy[i];
			if(0<nx&&nx<=n&&0<ny&&ny<=n)
			{
				if(d[ny][nx]>d[p.sc][p.fi]+f[ny][nx])
				{
					d[ny][nx]=d[p.sc][p.fi]+f[ny][nx];
					que.push(pi(nx,ny));
				}
			}
		}
	}
	//直接行ける
	if(d[n][n]<v) valid=true;
	if(!valid && ox*oy!=0)
	{//オアシスがある時
		//オアシスにたどり着いた直後の体力
		int nv=2*(v-d[oy][ox]);
		if(nv>0)
		{
			int d2[201][201];
			fill(d2[0],d2[201],INF);
			d2[oy][ox]=0;
			que.push(pi(ox,oy));
			while(!que.empty())
			{
				pi p=que.front();
				que.pop();
				rep(i,4)
				{
					int nx=p.fi+dx[i], ny=p.sc+dy[i];
					if(0<nx&&nx<=n&&0<ny&&ny<=n)
					{
						if(d2[ny][nx]>d2[p.sc][p.fi]+f[ny][nx])
						{
							d2[ny][nx]=d2[p.sc][p.fi]+f[ny][nx];
							que.push(pi(nx,ny));
						}
					}
				}
			}
			//オアシス経由で行ける
			if(d2[n][n]<nv) valid=true;
		}
	}
	if(valid) ans="YES";
	std::cout << ans << std::endl;
}
            
            
            
        