L2-4 哲哲打游戏 Java题解 (图,模拟)

输入样例:

10 11
3 2 3 4
1 6
3 4 7 5
1 3
1 9
2 3 5
3 1 8 5
1 9
2 8 10
0
1 1
0 3
0 1
1 2
0 2
0 2
2 2
0 3
0 1
1 1
0 2

输出样例:

1
3
9
10

样例解释:

简单给出样例中经过的剧情点顺序:

1 -> 4 -> 3 -> 7 -> 8 -> 3 -> 5 -> 9 -> 10。

档位 1 开始存的是 1 号剧情点;档位 2 存的是 3 号剧情点;档位 1 后来又存了 9 号剧情点。


解题思路:

这道题题意有点难懂,不认真读看完也不知道到说了个啥意思。。

 意思是做某个操作或选择可以走到这个顶点的第某个邻接边上,对图的存储可以用数组模拟邻接表,集合式的二维数组存储图,数组套集合存储图,其中将数组套进集合中速度最快,内存最少。另外再读取数据时,如果仅仅用bufferedreader,可能会因为中间产生大量字符串而导致内存超限,对于这种仅仅涉及整型数据的读取可以用streamtokenizer快读,效率很高。

Java代码:(数组模拟邻接表)

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.StreamTokenizer;
import java.util.Arrays;

public class Main {
	static final int M = 1000005;
	static final int N = 100005;
	static int []e = new int[M];
	static int []ne = new int[M];
	static int []h = new int[N];
	static int []w = new int[N];
	static int idx;
	
	static StreamTokenizer st = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));
	
	public static int ini() throws IOException {
		st.nextToken();
		return (int)st.nval;
	}
	
	public static void main(String[] args) throws IOException {
		int n = ini(), m = ini();
		Arrays.fill(h, -1);
		
		for(int i = 1; i <= n; i++) {
			int k = ini();
			w[i] = k;
			for(int j = 1; j <= k; j++)
				add(i, ini());
		}
		
		int st = 1;
		int []arr = new int [105];
		StringBuilder ans = new StringBuilder();
		while(m-- > 0) {
			int a = ini(), b = ini();
			
			if(a == 0) {
				int cnt = 0, x = st;
				for(int i = h[st]; i != -1 ; i = ne[i]) {
					st = e[i];
					cnt++;
					if(cnt == w[x] - b + 1) break;
				}
			}else if(a == 1) {
				arr[b] = st;
				ans.append(st + "\n");
			}else {
				st = arr[b];
			}
		}
		ans.append(st);
		System.out.print(ans.toString());
	}
	
	public static void add(int a, int b) {
		e[idx] = b;
		ne[idx] = h[a];
		h[a] = idx++;
	}
}

运行结果:

 

Java代码:(集合模拟邻接表)

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.StreamTokenizer;
import java.util.ArrayList;

public class Main {
	static StreamTokenizer st = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));
	public static int ini() throws IOException {
		st.nextToken();
		return (int)st.nval;
	}
	
	public static void main(String[] args) throws IOException {
		int n = ini(), m = ini();
		
		ArrayList<ArrayList<Integer>> list = new ArrayList<>();
			list.add(new ArrayList<>());
		for(int i = 1; i <= n; i++) {
			int k = ini();
			ArrayList<Integer> l = new ArrayList<>();
			for(int j = 1; j <= k; j++)
				l.add(ini());
			list.add(l);
		}
		
		int st = 1;
		int []arr = new int [105];
		StringBuilder ans = new StringBuilder();
		while(m-- > 0) {
			int a = ini(), b = ini();
			
			if(a == 0) {
				b--;
				st = list.get(st).get(b);
			}else if(a == 1) {
				arr[b] = st;
				ans.append(st + "\n");
			}else {
				st = arr[b];
			}
		}
		ans.append(st);
		System.out.print(ans.toString());
	}
}

运行结果:

 

Java代码:(数组套进集合模拟邻接表)

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.StreamTokenizer;
import java.util.ArrayList;

public class Main {
	static StreamTokenizer st = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));
	public static int ini() throws IOException {
		st.nextToken();
		return (int)st.nval;
	}
	
	static class Edge{
		int []edg;
		public Edge(int[] edg) {
			this.edg = edg;
		}
	}
	
	public static void main(String[] args) throws IOException {
		int n = ini(), m = ini();
		
		ArrayList<Edge> list = new ArrayList<>();
		int []aa = new int[1];
		list.add(new Edge(aa));
		for(int i = 1; i <= n; i++) {
			int k = ini();
			int []arr = new int[k + 1];
			for(int j = 1; j <= k; j++)
				arr[j] = ini();
			list.add(new Edge(arr));
		}
		
		int st = 1;
		int []arr = new int [105];
		StringBuilder ans = new StringBuilder();
		while(m-- > 0) {
			int a = ini(), b = ini();
			
			if(a == 0) {
				st = list.get(st).edg[b];
			}else if(a == 1) {
				arr[b] = st;
				ans.append(st + "\n");
			}else {
				st = arr[b];
			}
		}
		ans.append(st);
		System.out.print(ans.toString());
	}
}

运行结果:

 

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要使用gitlab4j依赖上传文件到GitLab上,您可以按照以下步骤进行操作: 1. 首先,确保您的项目中已正确引入了gitlab4j依赖。您可以在项目的pom.xml文件中添加以下依赖: ```xml <dependency> <groupId>org.gitlab4j</groupId> <artifactId>gitlab4j-api</artifactId> <version>4.13.6</version> </dependency> ``` 2. 创建一个GitLabApi实例,并使用您的GitLab访问令牌进行认证: ```java GitLabApi gitLabApi = new GitLabApi("https://gitlab.example.com", "YOUR_ACCESS_TOKEN"); ``` 请将"https://gitlab.example.com"替换为您的GitLab实例的URL,并将"YOUR_ACCESS_TOKEN"替换为您的有效访问令牌。 3. 选择要上传文件的项目和分支: ```java String projectId = "your_project_id"; String branchName = "your_branch_name"; ``` 请将"your_project_id"替换为要上传文件的项目ID,将"your_branch_name"替换为目标分支的名称。 4. 构建一个文件上传请求,并执行上传操作: ```java File fileToUpload = new File("path/to/your/file"); String commitMessage = "Upload file"; CommitAction commitAction = CommitAction.create() .withBranch(branchName) .withFilePath("path/in/repository") .withContent(fileToUpload) .withCommitMessage(commitMessage); Commit commit = gitLabApi.getRepositoryApi().createCommit(projectId, commitAction); ``` 请将"path/to/your/file"替换为要上传的文件的本地路径,将"path/in/repository"替换为要在GitLab仓库中创建的文件路径。 5. 您还可以添加其他选项,例如设置文件的权限或指定提交者等。详细信息可以查阅gitlab4j文档。 这样就可以使用gitlab4j依赖上传文件到GitLab上了。请确保您的GitLab访问令牌具有适当的权限来执行文件上传操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值