url: https://oj.xtu.edu.cn/problem.php?cid=1006&pid=3

在这里插入图片描述

样例输入

1
4 3
3 2 4 1

样例输出

1110
1101
1111
1010

解题思路:深度优先搜索。当到达最后一层时,函数会标记 a[i][j] = 1,表示从第一层的第 j 个元素可以到达最后一层的第 i 个元素。

#include<stdio.h>
#include<string.h>
int n, m;
int get_next[110];
//a数组第i行第j列的元素为1,意味着从第一层的第j个元素出发,
//能走到最后一层的第i个元素,为0就走不到
int a[110][110];
//用dfs来模拟走的过程
void dfs(int j, int i, int layer) {
	//走到最后一层
	if (layer == m) {
		//这说明从第一层的第j个元素出发,
		//能走到最后一层的第i个元素,记录下来
		a[i][j] = 1;
		return;
	}
	dfs(j, get_next[i], layer + 1);
	if (get_next[i] > 1) dfs(j, get_next[i] - 1, layer + 1);
}
int main()
{
	int t;
	scanf("%d", &t);
	while(t--) {
		memset(a, 0, sizeof(a));
		scanf("%d %d", &n, &m);
		for (int j = 1; j <= n; j++) {
			scanf("%d", get_next + j);
		}
		//从第一层的第1个元素出发->从第一层的第n个元素出发
		for (int j = 1; j <= n; j++) {
			dfs(j, j, 1);
		}
		for (int i = 1; i <= n; i++) {
			for (int j = 1; j <= n; j++) {
				printf("%d", a[i][j]);
			}
			printf("\n");
		}
		printf("\n");
	}
 	return 0;
}
Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐