现在的位置: 首页 > 综合 > 正文

ZOJ1067

2019年08月20日 ⁄ 综合 ⁄ 共 916字 ⁄ 字号 评论关闭

简单题,我用dfs求关系的,没用栈的非递归方式,最后想说一句网上看到的读取一个数字的方式

sscanf(str+pos,"%d%n",&sum,&n)...其中%n表示至此已读入的字符数,在这道题中比较有用,学到了~

#include<cstdio>
#include<cstring>
int n;
int g[52][52],d[52];
char s[300];
int cnt;
void dfs(int x)
{
     for(;cnt<strlen(s);cnt++)
     {
                                  if(s[cnt]==' ')
                                  continue;
                                  if(s[cnt]==')')
                                  return;
                                  if(s[cnt]=='(')
                                  {
                                                 int sum=0;
                                                 cnt++;
                                                 while(s[cnt]==' ')
                                                 cnt++; 
                                                 while(cnt<strlen(s)&&s[cnt]>='0'&&s[cnt]<='9')
                                                 {
                                                                                         sum=sum*10+s[cnt]-'0';
                                                                                         cnt++;
                                                 }
                                                 if(x!=0)
                                                 {
                                                         g[x][sum]=g[sum][x]=1;
                                                         d[x]++;
                                                         d[sum]++;
                                                 }
                                                         dfs(sum);
                                  }
     }
     return;
}
int main()
{
	while(gets(s))
	{
		cnt=0;
		n=0;
		memset(g,0,sizeof(g));
		memset(d,0,sizeof(d));
		dfs(0);
	/*	for(int i=1;i<=10;i++)
		for(int j=1;j<=10;j++)
		{
                if(g[i][j])
                printf("%d %d\n",i,j);
                }
                */
		int ff=0;
		for(int i=1;i<=50;i++)
		if(d[i])
        n++;
		for(int c=1;c<=n-1;c++)
		{
			int tp,index=60;
			for(int i=1;i<=50;i++)
			{
				if(d[i]==1&&i<index)
						index=i;
			}
			d[index]=0;
			for(int i=1;i<=50;i++)
			{
				if(g[index][i])
				{
					g[index][i]=0;
					g[i][index]=0;
					if(ff==0)
					{
						ff=1;
						printf("%d",i);
					}
					else
						printf(" %d",i);
					d[i]--;
				}
			}
		}
		puts("");
	}
	return 0;
}

【上篇】
【下篇】

抱歉!评论已关闭.