欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

samsung第一次面试题(20180302)

程序员文章站 2022-06-19 08:25:58
...

一、题目要求

遍历一个图,输出它的其中一个环。

格式:顶点数    顶点对数

例如:

输入

5 5
4 3 2 4 3 5 3 2 1 4
5 5
4 3 2 4 3 5 2 3 1 4
8 9 

5 2 3 2 6 3 8 7 2 1 6 4 2 4 1 5 7 8

输出

4-3-2-4
0

7-8-7

二、算法(自己写的)

#include<stdio.h>
#define MAX 10
int vertex[MAX];
int adj[MAX][MAX];


int num=0;
int cycle=999;
int AnswerN=0;
int Answer[MAX];
int N,M;
void DFS_cycle(int i)//遍历顶点i
{
	int j,k;
	if(cycle==1 || cycle==0)//若已经知道是否能够成环,则放弃递归遍历
		return ;
	Answer[num]=i;//将正在递归的数i放在数组中
	num++;
	for(j=1;j<N;j++)//遍历顶点为i的邻接节点j
	{
		if(cycle==999)//若还不知道图是否能够形成环
		{
			if(adj[i][j]==1)//若顶点j是顶点i的邻接顶点
			{
				for(k=0;k<num;k++)//判断此时的顶点j是否已经被访问过
				{
					if(Answer[k]==j)//若顶点j和前面数组的数有一个是重复的,说明顶点j已经被访问过
					{
						if(k==0)//若与前面的第一个顶点是一样的,则够成一个环
						{
							Answer[num]=j;
							cycle=1;
							AnswerN=num+1;
							break;
						}
						else
						{
							cycle=0;
							AnswerN=0;
							break;
						}
					}
				}
				if(k==num)
				{
					DFS_cycle(j);
				}
			}
		}
	}
	
}
//fill the adjacent matrix  and call the function of DFS_cycle
int main()
{
	int z;
	int i,j,k;
	int A[MAX],B[MAX];
	printf("please input vertex_num and vertex_pair_num\n");
	scanf("%d",&N);
	scanf("%d",&M);
	printf("please input M vertex_pairs\n");
	for(i=0;i<M;i++)
	{
		scanf("%d",&A[i]);
		scanf("%d",&B[i]);
	}
	//print A[i],B[i]
	//for(i=0;i<M;i++)
	//{
	//	printf("%d\t",A[i]);
	//	printf("%d\t",B[i]);
	//}
	//printf("\n");
	//initialize vertex
	for(i=1;i<=N;i++)
	{
		vertex[i]=i;
	}
	//initialize adjacency matrix
	for(i=1;i<=N;i++)
	{
		for(j=1;j<=N;j++)
		{
			adj[i][j]=0;
		}
	}
	//fill the adjaceny matrix
	for(i=1;i<=N;i++)//row   i=3
	{
		for(j=0;j<M;j++)//Traverse array A[j]  //j=2
		{
			if(i==A[j])      
			{
				//search B[j]'s location in vertex
				for(k=1;k<=N;k++)
				{
					if(B[j]==k)  //k=2
					{
						adj[i][k]=1;
						break;
					}
				}
			}
		}
	}
	//print the adjaceny matrix
	for(i=1;i<=N;i++)
	{
		for(j=1;j<=N;j++)
		{
			printf("%d\t",adj[i][j]);
		}
		printf("\n");
	}
	//call the function of DFS_cycle and print the result.
	for(z=1;z<N;z++)
	{
		DFS_cycle(z);
		printf("cycle=%d\t",cycle);
		printf("AnswerN=%d\t",AnswerN);
		if(cycle==0)
		{
			num=0;
			AnswerN=0;
			cycle=999;
		}
		else//若出现一个环,立马输出
			break;	
		printf("\n");
	}
	printf("\n");
	//DFS_cycle(1);//无输出	
	//DFS_cycle(2);//输出2——>4——>3——>2
	//DFS_cycle(3);//输出3——>2——>4——>3
	//DFS_cycle(4);//输出4——>3——>2——>4
	/*printf("cycle=%d\t",cycle);
	printf("AnswerN=%d\t",AnswerN);*/
	printf("环的组成\n");
	for(i=0;i<AnswerN;i++)
	{
		printf("%d\t",Answer[i]);
	}
}

相关标签: interview