Submission #2070492


Source Code Expand

//Food Collector
#include<iostream>
#include<fstream>
#include<stdio.h>
#include<time.h>
#include<string>
#include<vector>
#include<map>
#include<list>
#include<set>
#include<stack>
#include<cstdlib>
#include<algorithm>
#include<random>
#include<cassert>
using namespace std;
#define LL long long
#define ROOP() while(true)

int H,W,K;
int sx,sy;
bool mp[50][50];
int N;
pair<int,int> esa[50][50];
vector<pair<int,int>> ok_list;
vector<pair<int,int>> esa_list;
int dis[50][50][50][50] = {};
set<pair<int,int>> sumi;

void search(int sx, int sy, int x, int y, int c){
	if(mp[x-1][y] && dis[sx][sy][x-1][y]>c+1){
		dis[sx][sy][x-1][y] = c+1;
		search(sx,sy,x-1,y,c+1);
	}
	if(mp[x+1][y] && dis[sx][sy][x+1][y]>c+1){
		dis[sx][sy][x+1][y] = c+1;
		search(sx,sy,x+1,y,c+1);
	}
	if(mp[x][y-1] && dis[sx][sy][x][y-1]>c+1){
		dis[sx][sy][x][y-1] = c+1;
		search(sx,sy,x,y-1,c+1);
	}
	if(mp[x][y+1] && dis[sx][sy][x][y+1]>c+1){
		dis[sx][sy][x][y+1] = c+1;
		search(sx,sy,x,y+1,c+1);
	}
}

int tmp_cost[50][50];
void back(int nx, int ny, int gx, int gy, int c){
	if(dis[gx][gy][nx-1][ny] == dis[gx][gy][nx][ny]-1 && tmp_cost[nx-1][ny] < c+esa[nx-1][ny].first-esa[nx-1][ny].second*dis[gx][gy][nx-1][ny]){
		tmp_cost[nx-1][ny] = c+esa[nx-1][ny].first-esa[nx-1][ny].second*dis[gx][gy][nx-1][ny];
		back(nx-1,ny,gx,gy,c+esa[nx-1][ny].first-esa[nx-1][ny].second*dis[gx][gy][nx-1][ny]);
	}
}

int s_time;
int main(){
	//データ入力ここから↓
	
	cin >> H >> W >> K;
	s_time = clock();
	cin >> sy >> sx;
	sx--;
	sy--;
	
	for(int i=0; i<H; i++){
		string s;
		cin >> s;
		for(int j=0; j<W; j++){
			if(s[j]=='.'){
				mp[j][i]=true;
				ok_list.push_back(make_pair(j,i));
			}
			else mp[j][i]=false;

			for(int k=0; k<H; k++){
				for(int l=0; l<W; l++){
					dis[j][i][l][k] = INT_MAX;
				}
			}
			dis[j][i][j][i] = 0;
		}
	}

	for(int i=0; i<H; i++){
		for(int j=0; j<W; j++){
			esa[j][i] = make_pair(0,0);
		}
	}

	cin >> N;
	for(int i=0; i<N; i++){
		int x,y,F,D;
		cin >> y >> x >> F >> D;
		esa[x-1][y-1].first = F;
		esa[x-1][y-1].second = D;
		esa_list.push_back(make_pair(x-1,y-1));
	}

	//データ入力ここまで↑

	//メイン処理ここから↓
	int nx = sx;
	int	ny = sy;
	for(int ti = 0; ti<K; ti++){
		//[1] 最短距離計算
		if(sumi.count(make_pair(sx,sy)) <= 0){
			search(sx, sy, sx, sy, 0);
			sumi.insert(make_pair(sx,sy));
			//for(int i=0; i<50; i++){
			//	for(int j=0; j<50; j++){
			//		cout << dis[sx][sy][j][i];
			//	}
			//	cout << endl;
			//}
		}

		//[2] 優先度の計算・行き先の決定
		int max_real = INT_MIN;
		int i_m = -1;
		for(int i=0; i<esa_list.size(); i++){
			int real = esa[esa_list.at(i).first][esa_list.at(i).second].first
				- esa[esa_list.at(i).first][esa_list.at(i).second].second * dis[nx][ny][esa_list.at(i).first][esa_list.at(i).second];
			if(real>max_real){
				max_real = real;
				i_m = i;
			}
			if(real==max_real && dis[nx][ny][esa_list.at(i).first][esa_list.at(i).second]<dis[nx][ny][esa_list.at(i_m).first][esa_list.at(i_m).second]){
				max_real = real;
				i_m = i;
			}
		}

		//[3] 移動経路
		for(int i=0; i<50; i++){
			for(int j=0; j<50; j++){
				tmp_cost[i][j] = -1;
			}
		}
		back(esa_list.at(i_m).first,esa_list.at(i_m).second,
			nx,ny,0);

		//[4] 移動処理
	}
	//メイン処理ここまで↑
 
	cout << (clock()-s_time)/CLOCKS_PER_SEC << endl;

	return 0;
}

Submission Info

Submission Time
Task B - Food Collector
User Pro_ktmr
Language C++14 (GCC 5.4.1)
Score 0
Code Size 3511 Byte
Status CE

Compile Error

./Main.cpp: In function ‘int main()’:
./Main.cpp:80:24: error: ‘INT_MAX’ was not declared in this scope
      dis[j][i][l][k] = INT_MAX;
                        ^
./Main.cpp:121:18: error: ‘INT_MIN’ was not declared in this scope
   int max_real = INT_MIN;
                  ^