poj1094注意事项

来源:互联网 发布:雷欧团灭mac的怪兽 编辑:程序博客网 时间:2024/05/07 12:53

输出的字符串中少打了一个“.”号,就被告知Wrong Answer,切记


代码如下:


#include "stdio.h"#include "string.h"/*DealWithLine函数的返回状态*/#define FAIL -1#define SUCCESS 1#define REPEATED 0#define NOTSURE -2/*栈空间*/#define STACK_SIZE 100#define SYM_MAX_NUM 26int stack[STACK_SIZE];int stackTop;/*题目的输入参数*/int m=-1,n=-1;int froms[SYM_MAX_NUM];//froms[n]n的入度int graph[SYM_MAX_NUM][SYM_MAX_NUM];//有向图int seq[SYM_MAX_NUM*2];//数组设为26*2,为了避免下标越界char line[5];//用于保存一行关系的字符串void push(int e){stackTop++;stack[stackTop]=e;}int pop(){if(stackTop==-1)return -1;elsereturn stack[stackTop--];}int DealWithLine(){int sym1,sym2;int j,k,i;int pNUM=0;//记录入度为0的点个数int checkedPNUM=0;//记录当前已经搜索了的点个数int notSureFlag=0;//如果在搜索过程中发现有1个以上的入度为0的点,则该标志置高int froms_cpy[SYM_MAX_NUM];//各点入度的备份sym1=line[0]-0x41;sym2=line[2]-0x41;if(graph[sym1][sym2]==1)//重复的关系return REPEATED;graph[sym1][sym2]=1;//更新有向图froms[sym2]++;//更新入度memcpy(froms_cpy,froms,n*sizeof(int));for(j=0;j<n;j++)//初始化栈内容,用以深度优先搜索if(froms_cpy[j]==0){pNUM++;push(j);}if(pNUM==0) return FAIL;//入度为0的点如果没有,则意味着有闭环if(pNUM>1) notSureFlag=1;//入度为0点大于1,则意味着有关系不确定while(stackTop>-1){//深度优先搜索至栈为空int p;pNUM=0;p=pop();seq[checkedPNUM]=p;checkedPNUM++;if(froms_cpy[p]==-1) return FAIL;//如果该点已经搜索过,说明已经形成环froms_cpy[p]=-1;//入度为-1,标志该点已经搜索过for(k=0;k<n;k++){if(graph[p][k]==1){froms_cpy[k]--;//被p点指向的点的入度减1if(froms_cpy[k]==0){//如果入度减1之后变成0,则将该点入栈push(k);pNUM++;}}}if(pNUM>1) notSureFlag=1;}if(checkedPNUM<n) return FAIL;if(notSureFlag!=1) return SUCCESS;return NOTSURE;}int main(){//freopen("../POJ1094_Sorting_it_all_out/in.txt", "r", stdin);//freopen("../POJ1094_Sorting_it_all_out/out.txt", "w", stdout);/* 中间按原样写代码,什么都不用修改 */while(!(m==0 && n==0)){scanf("%d %d",&n,&m);stackTop=-1;memset(froms,0,SYM_MAX_NUM*sizeof(int));memset(graph,0,SYM_MAX_NUM*SYM_MAX_NUM*sizeof(int));int i=0;for(i=0;i<m;i++){scanf("%s",line);int r=DealWithLine();if(r==FAIL){printf("Inconsistency found after %d relations.\n",i+1);break;}else if(r==SUCCESS){printf("Sorted sequence determined after %d relations: ",i+1);for(int j=0;j<n;j++){printf("%c",seq[j]+0x41);}printf(".\n");break;}else if(r==REPEATED){//printf("Inconsistency found after %d relations.\n",i+1);//break;continue;}else{if(i==m-1){printf("Sorted sequence cannot be determined.\n");}else{continue;}}}while(i<m-1){scanf("%s",line);i++;}}//fclose(stdin);//fclose(stdout);return 0;}


0 0
原创粉丝点击