这题一开始想bfs+dfs(bfs得到最短路径,dfs得到最短路径的数目),结果总是超时,虽然我也优化了dfs;最后改了方法,直接bfs,cnt数组记录了每个点最短路径的数目,visited数组记录每个点的最短路径 #include<iostream> using namespace std; #include<cstdio> #include<cmath> struct Point { int i,j; }; Point queue[100000]; int dir[4][2]={{-1,0},{0,1},{1,0},{0,-1}}; int maze[200][200]; int visited[200][200]; int cnt[200][200]; void bfs(int m,int n,Point st) { int i,j,k,next_i,next_j,front=-1,rear=0; Point item,temp; for(i=1;i<=m;i++) for(j=1;j<=n;j++) visited[i][j]=-1; queue[0]=st; visited[st.i][st.j]=0; while(front<rear) { item=queue[++front]; for(k=0;k<4;k++) { next_i=item.i+dir[k][0]; next_j=item.j+dir[k][1]; if(!maze[next_i][next_j]) { if(visited[next_i][next_j]==-1) { visited[next_i][next_j]= visited[item.i][item.j]+1; cnt[next_i][next_j]+=cnt[item.i][item.j]; temp.i=next_i; temp.j=next_j; queue[++rear]=temp; } else if(visited[next_i][next_j]== visited[item.i][item.j]+1) cnt[next_i][next_j]+=cnt[item.i][item.j]; } } } } int main() { int n,m,k,i,j,a,b; Point s,e; while(scanf("%d%d%d",&n,&m,&k)!=EOF) { for(j=0;j<=m+1;j++) maze[0][j]=maze[n+1][j]=1; for(i=0;i<=n+1;i++) maze[i][0]=maze[i][m+1]=1; for(i=1;i<=n;i++) for(j=1;j<=m;j++) maze[i][j]=0; for(i=1;i<=k;i++) { scanf("%d%d",&a,&b); maze[a][b]=1; } for(i=1;i<=n;i++) for(j=1;j<=m;j++) cnt[i][j]=0; scanf("%d%d%d%d",&s.i,&s.j,&e.i,&e.j); if(s.i==e.i&&s.j==e.j) { printf("0/n0/n"); continue; } cnt[s.i][s.j]=1; bfs(n,m,s); if(visited[e.i][e.j]==-1) { printf("No Solution!/n"); continue; } else printf("%d/n%d/n",visited[e.i][e.j],cnt[e.i][e.j]); } return 0; }