CZCCZC @ 2022-03-30 07:52:18
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<stack>
#include<queue>
#include<map>
#include<set>
#include<algorithm>
#include<cstdlib>
#include<iomanip>
using namespace std;
#define MIN (x , y , t) if(x >= 0 && y >= 0) death[x][y] = min(death[x][y] , t)
#define MAXN 310
struct coord {
int x , y ;
};
queue < coord > Q ;
int ans[MAXN][MAXN] , death[MAXN][MAXN] ;
int wk[4][2] = {{0 , 1} , {1 , 0} , {-1 , 0} , {0 , -1}} ;
int main() {
int m , Ans = 100000 ;
memset(ans , -1 , sizeof(ans)) ;
memset(death , 0x7f , sizeof(death)) ;
cin >> m ;
for(int i = 1 ; i <= m ; i++) {
int x , y , t ;
cin >> x >> y >> t ;
MIN(x , y , t) ;
for(int k = 0 ; k < 4 ; k++)
MIN(x + wk[k][0] , y + wk[k][1] , t) ;
}
Q.push((coord) {0 , 0}) ;
ans[0][0] = 0 ;
while(!Q.empty()) {
coord u = Q.front() ;
int ux = u.x , uy = u.y ;
Q.pop() ;
for(int k = 0 ; k < 4 ; k++) {
int x = ux + wk[k][0] , y = uy + wk[k][1] ;
if(x < 0 || y < 0 || ans[x][y] != -1 || ans[ux][uy] + 1 >= death[x][y])
continue ;
ans[x][y] = ans[ux][uy] + 1 ;
Q.push((coord) {x , y}) ;
}
}
for(int i = 0 ; i <= 305 ; i++)
for(int j = 0 ; j <= 305 ; j++)
if(death[i][j] > 1000 && ans[i][j] != -1)
Ans = min(Ans , ans[i][j]);
if(Ans == 100000)
puts("-1") ;
else
cout << ans << endl ;
return 0 ;
}
自定义的MIN语句错误(第十三行),哪位大佬能帮我看一下?
by wtcqwq @ 2022-03-30 07:56:17
说实话,整个代码就用了两次MIN
还是不偷懒好
by wtcqwq @ 2022-03-30 07:59:03
具体原因是
你的
#define MIN (x , y , t) if(x >= 0 && y >= 0) death[x][y] = min(death[x][y] , t)
这一句后MIN和(间有空格
而
MIN(x + wk[k][0] , y + wk[k][1] , t) ;
这一句MIN和(间没空格
by fzy1026 @ 2022-03-30 08:18:48
话说不是有内置的min()函数么。。。。。
by CZCCZC @ 2022-03-30 08:26:05
@fzy1026 这里的MIN是判断三个数的,内置的min函数只能判断两个数的最小值。
by CZCCZC @ 2022-03-30 08:26:58
@王韬淳 谢谢提醒
by fzy1026 @ 2022-03-30 08:29:11
@CZCCZC 嵌套一下不就得了
by CZCCZC @ 2022-03-30 08:32:13
@fzy1026 这里的MIN函数还需要判断x、y都大于0,自带的是直接求最小值,不分正负。
by Southern_Dynasty @ 2022-03-30 09:45:36
@CZCCZC 深基上的?
by CZCCZC @ 2022-03-30 09:58:03
@暗夜黑黑黑手 对,搜索题单第4题