题目连接:http://codeforces.com/problemset/problem/656/E
愚人节专场的E,整个其实就是个Floyd算法,但是要求代码中不能包含
define
do
for
foreach
while
repeat
until
if
then
else
elif
elsif
elseif
case
switch
这些关键词。
如果不考虑屏蔽define,很容易想到将代码中用到的关键词全部define成其它不在列表中的词。但是define的时候还是得要写出原来的关键词,况且define也被屏蔽了,有一种方法是利用将代码分行。
于是C++代码解决这道问题就成了如下所示
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include <iostream> 2 #include <vector> 3 #include <algorithm> 4 #include <string> 5 #include <string.h> 6 #include <stdio.h> 7 #include <math.h> 8 #include <queue> 9 #include <stack> 10 #include <map> 11 #include <ctime> 12 #include <set> 13 using namespace std; 14 const int N=12; 15 #def 16 ine foo fo 17 r 18 int g[N][N]; 19 int dis[N][N]; 20 void floyd(int n) { 21 memcpy(dis,g,sizeof g); 22 foo (int k=1; k<=n; k++){ 23 foo (int i=1; i<=n; i++){ 24 foo (int j=1; j<=n; j++) { 25 dis[i][j]=min(dis[i][j],dis[i][k]+dis[k][j]); 26 } 27 } 28 } 29 } 30 int main () { 31 int n; 32 cin>>n; 33 foo (int i=1;i<=n;i++) { 34 foo (int j=1;j<=n;j++) { 35 cin>>g[i][j]; 36 } 37 } 38 floyd(n); 39 int ret=0; 40 foo (int i=1;i<=n;i++) { 41 foo (int j=1;j<=n;j++) { 42 ret=max(ret,dis[i][j]); 43 } 44 } 45 cout<<ret<<endl; 46 return 0; 47 }
其实也可以直接写一个程序,生成代码(IO以及Floyd),但是没有上面的用分行显得雅观。
除了C++也有很多语言也可以有办法做此题。还看到有人用PHP的解码来做,可惜我不懂PHP。