#include <stdio.h> #include <string.h> #include <alloc.h>
struct Route { char from[16]; char to[16]; int flag; }; typedef struct Route ROUTE;
char **stack_temp; int top=-1; int F=0;
void showroute(char **str1); void push(char **str1,char* str2); void pop(char **str1); int find(ROUTE ** rou,char * str,int v); int main() { int N,V; /*前一个为city个数,后一个为航线个数*/ int i,j; char city[2][16];/*用于储存最西及最东的city */ /*char **stack_temp;*//* **stack_end; */ ROUTE ** route; ROUTE * Rptr;
while(scanf("%d%d",&N,&V)!=EOF) { stack_temp=(char **)malloc((N+1)*sizeof(char *)); /* stack_end=(char **)malloc((N+1)*sizeof(char *)); */ route=(ROUTE **)malloc(V*sizeof(ROUTE *));
for(i=0;i<=N;i++) { stack_temp[i]=(char *)malloc(16*sizeof(char )); /* stack_end[i]=(char *)malloc(16*sizeof(char )); */ } /*建立两个大小为char型 (N+1)*15的空间*/ scanf("%s",city[0]); for(i=1;i<N;i++) { scanf("%s",city[1]); } /*读入最西及最东的城市*/
for(j=0;j<V;j++) { route[j]=(ROUTE *)malloc(sizeof( ROUTE )); scanf("%s%s",route[j]->from,route[j]->to); route[j]->flag=1; } /*建一个航班库*/ /* strcpy(stack_temp[top],city[0]); */ push(stack_temp,city[0]);
while(1) { if(!strcmp(stack_temp[top],city[0])&&F)break; if(!strcmp(stack_temp[top],city[1]))F=1; if(!find(route,stack_temp[top],V))break;
} /*注意为了让你看清程序,该程式没有回溯 */
if(!strcmp(stack_temp[top],city[0])&&top) { printf("%d\n",N); printf("%d\n",top); showroute(stack_temp); } else { printf("%d\n",N); printf("NO SOLUTION\n"); }
for(i=0;i<N;i++)free(stack_temp[i]); free(stack_temp); for(j=0;j<V;j++)free(route[j]); free(route); top=-1; F=0; } } void push(char **str1,char* str2) { ++top; strcpy(str1[top],str2); } void pop(char **str1) { str1[top][0]='\0'; --top; } int find(ROUTE ** rou,char * str,int v) { int i; if(!F) { for(i=0;i<v;i++)
{
if(!(strcmp(str,rou[i]->from))&&rou[i]->flag==1) { rou[i]->flag=-1; push(stack_temp,rou[i]->to); return 1; } } } else { for(i=0;i<v;i++)
{
if(!(strcmp(str,rou[i]->to))&&rou[i]->flag==1) { rou[i]->flag=-1; push(stack_temp,rou[i]->from); return 1; } } }
return 0; } void showroute(char **str1) { int i=0;
while(i<top)printf("%s\n",str1[i++]); printf("%s\n",str1[i]);
}
你的问题不用回溯啊?要回溯自己改吧^_^
九洲方除百尺冰,映秀又遭蛮牛耕。汽笛嘶鸣国旗半,哀伤尽处是重生。 -老K
治国就是治吏。礼义廉耻,国之四维。四维不张,国之不国。 -毛泽东