# Array# Input/Output# Greedy

f148 - 2. 定向越野 (Orienteering)

🔗 前往 ZeroJudge 原題

題目描述

題目給定一個二維地圖,地圖由 '0' 和小寫字母組成。字母代表目標點,'0' 代表障礙物。題目要求找到前 t 個出現的目標點的座標,並按照目標點字母的順序輸出。如果目標點少於 t 個,則輸出 "Mission fail."。

解題思路

程式碼首先讀取地圖的尺寸 x 和 y,以及需要找到的目標點數量 t。然後,它遍歷地圖,將每個目標點的座標儲存在 ans 陣列中,其中 ans[i][0] 儲存第 i 個字母的行座標,ans[i][1] 儲存第 i 個字母的列座標。如果找到目標點,則將 a 變數加 1,表示已找到一個目標點。最後,程式碼檢查是否找到了至少 t 個目標點。如果找到了,則按照字母的順序輸出前 t 個目標點的座標。否則,輸出 "Mission fail."。

複雜度分析

  • 時間複雜度: O(x * y)
  • 空間複雜度: O(1)

程式碼

#pragma GCC optimize("Ofast,unroll-loops,no-stack-protector,fast-math")
#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")
#include <stdio.h>
int ans[26][2],x,y,t,a(0);
char n;
inline int read(){
	int a(0);
	char c('0');
	while(c>='0'){
		a=(a<<3)+(a<<1)+c-'0';
		c=getchar_unlocked();
	}
	return a;
}
inline void write(int x) {
	if(x==0){
		putchar_unlocked('0');
		return;
	}
	int stk[9],*ptr(&stk[0]);
	while(x){*ptr=x%10;x/=10;++ptr;}
	while(--ptr>=(&stk[0])){putchar_unlocked(*ptr+'0');}
}
int main(){
	x=read();
	y=read();
	t=read();
	for(int i(0);i<26;++i)
		ans[i][0]=-1;
	for(int i(0),j(0);i<x;++i,j=0){
		for(;j<y;++j){
			n=getchar_unlocked();
			if(n!='0'){
				n-=97;
				ans[n][0]=i;
				ans[n][1]=j;
				++a;
			}
			n=getchar_unlocked();
		}
	}
	if(a<t)
		puts("Mission fail.");
	else{
		for(int i(0);t>0;++i){
			if(ans[i][0]!=-1){
				write(ans[i][0]);
				putchar_unlocked(' ');
				write(ans[i][1]);
				putchar_unlocked('\n');
				--t;
			}
		}
	}
}

Discussion