貌似说这道题递归会溢出。明天用另一种方法写一下 题意: 计算一个迷宫所有点之间最远的距离 分析 1. 求树的最长路 2. 树型DP。 3. rt中,不多说了 #include <iostream> #include <cmath> using namespace std; class node { public: node *link[4]; int childnum; int dis; node(); }; node::node() { childnum=0; dis=0; } int direct[5][2]={0,0,0,1,1,0,-1,0,0,-1}; node *T; int c,r; int sposx,sposy; int maxrope; char mapp[1001][1001]; bool used[1001][1001]; void creattree(node *t,int sposx,int sposy); int cal_dis(node *t); void cal_rope(node *t); int main() { int cases; cin>>cases; while (cases--) { maxrope=0x80000000; T=new node(); cin>>c>>r; bool findstart=false; for (int i=1;i<=r;++i) { for (int j=1;j<=c;++j) { cin>>mapp[i][j]; used[i][j]=false; if (findstart==false && mapp[i][j]=='.') { sposx=i; sposy=j; findstart=true; } } } used[sposx][sposy]=true; creattree(T,sposx,sposy); cal_dis(T); cal_rope(T); printf("Maximum rope length is %d./n",maxrope); } } void creattree(node *t,int sposx,int sposy) { int nowposx,nowposy; for (int i=1;i<=4;++i) { nowposx=sposx+direct[i][0]; nowposy=sposy+direct[i][1]; if (nowposx>=1 && nowposx<=r && nowposy>=1 && nowposy<=c && mapp[nowposx][nowposy]=='.' && !used[nowposx][nowposy] ) { used[nowposx][nowposy]=true; t->childnum++; t->link[t->childnum]=new node(); creattree(t->link[t->childnum],nowposx,nowposy); } } } int cal_dis(node *t) { if (t->childnum==0) { return 0; } if (t->dis!=0) return t->dis; int maxnum=0x80000000; for (int i=1;i<=t->childnum;++i) { if (maxnum<=cal_dis(t->link[i])) { maxnum=cal_dis(t->link[i])+1; } } t->dis=maxnum; return maxnum; } void cal_rope(node *t) { int tem=0x80000000; if (t->childnum==0) { if (tem<1) { tem=1; } } else if (t->childnum==1) { if (tem<t->link[1]->dis+1) { tem=t->link[1]->dis+1; } } else { int a,b; a=b=0x80000000; for (int i=1;i<=t->childnum;++i) { if (t->link[i]->dis>a) { b=a; a=t->link[i]->dis; } else { if (t->link[i]->dis>b) { b=t->link[i]->dis; } } } tem=a+b+2; } if (tem>maxrope) { maxrope=tem; } }