我正在查看Topcoder上的问题解决方案,并遇到了这个问题:
http://community.topcoder.com/stat?c=problem_solution&rm=249419&rd=9996&pm=6621&cr=309453
目前我不知道算法是如何工作的,但是代码中“<?=”运算符的用法是什么?我尝试在我的机器上编译代码,也在ideone.com上编译,但令我惊讶的是,代码无法编译。运营商做了什么,为什么它不能在像ideone这样的标准编译器上运行,代码在Topcoder上传递系统测试?
代码在这里:
using namespace std;
#include <stdlib.h>
#include <stdio.h>
#include <math.h>
#include <ctype.h>
#include <string.h>
#include <string>
#include <sstream>
#include <iostream>
#include <vector>
#include <queue>
#include <stack>
#include <set>
#include <map>
#include <algorithm>
#include <functional>
#define PB push_back
#define SZ size()
#define REP(v, hi) for (int v=0; v<(hi); v++)
#define REPD(v, hi) for (int v=((hi)-1); v>=0; v--)
#define FOR(v, lo, hi) for (int v=(lo); v<(hi); v++)
#define FORD(v, lo, hi) for (int v=((hi)-1); v>=(lo); v--)
typedef vector <int> VI;
typedef vector <VI> VVI;
typedef vector <VVI> VVVI;
/* ############################ THE REAL CODE ############################ */
class RoboRace {
public:
int startTime(vector <string> m, vector <string> _c) {
string c;
REP(i,_c.SZ) c+=_c[i];
int N=c.SZ;
int Y=m.SZ, X=m[0].SZ;
VVVI best(Y, VVI(X, VI(N+1, 99999)));
int ey=-1,ex=-1;
int yy=-1,yx=-1;
int fy=-1,fx=-1;
REP(y,Y) REP(x,X) {
if (m[y][x]=='Y') { yy=y; yx=x; m[y][x]='.'; }
if (m[y][x]=='F') { fy=y; fx=x; m[y][x]='.'; }
if (m[y][x]=='X') { ey=y; ex=x; m[y][x]='.'; }
}
REP(n,N+1) best[ey][ex][n]=n;
REPD(n,N) REP(y,Y) REP(x,X) {
if (m[y][x]=='#') continue;
best[y][x][n] <?= best[y][x][n+1];
if (c[n]=='N' && y>0) best[y][x][n] <?= best[y-1][x][n+1];
if (c[n]=='S' && y<Y-1) best[y][x][n] <?= best[y+1][x][n+1];
if (c[n]=='W' && x>0) best[y][x][n] <?= best[y][x-1][n+1];
if (c[n]=='E' && x<X-1) best[y][x][n] <?= best[y][x+1][n+1];
}
REP(n,N) if (best[yy][yx][n] < best[fy][fx][n]) return n;
return -1;
}
};
答案 0 :(得分:6)
这是一个gcc扩展,复合最小运算符,一个二进制运算符,它将最小的操作数赋给左操作数。它在gcc手册的deprecated features list中提到。
A <?= B
表示将A和B的最小值分配给A 。
还有(还)
<? minimum operator
>? maximum operator
>?= compound form of maximum operator
现在的Sane代码将改为使用std::min
。