hanoi塔的递归算法实现及转化为非递归算法

时间: 2023-06-01 21:02:20 浏览: 33
### 回答1: 随着计算机的发展,汉诺塔的递归算法已经成为了一种优秀的算法,可以轻松地实现汉诺塔问题的求解。但是,我们也可以将汉诺塔问题转化为非递归算法来解决,这种方法往往会增加代码复杂度,但在某些情况下也能够达到不错的效果。因此,我们可以根据具体的需求和场景选择适合的算法来解决汉诺塔问题。 ### 回答2: Hanoi塔问题源于一个古老的传说,传说有三根柱子和64个圆盘,圆盘大小不一,大的在下小的在上,穿在中间柱子的杆子上,目标是将所有盘子从中间柱子移到右边柱子。但是,在移动的过程中,你不能把一个大盘子放在一个小盘子上面。 Hanoi塔问题可以通过递归算法来解决。具体实现方法是:假设有一个汉诺塔问题,有三个柱子A、B和C,A柱子有n个盘子,B柱子没有,C柱子没有,我们需要把所有的盘子从A柱子移到C柱子上。我们可以将这个问题分成三个子问题:将A柱子上n-1个盘子移到B柱子上,将A柱子上的最后一个盘子移到C柱子上,将B柱子上的所有n-1个盘子移到C柱子上。其中,第一步和第三步就是将n-1个盘子移动到另一个柱子上,在这里我们可以使用递归来完成子问题的解决。 递归算法的伪代码如下: void Hanoi(int n, char src, char dest, char temp) { if (n == 1) { // 如果只有一个盘子,直接将盘子移动到目标柱子 cout << "Move disk 1 from " << src << " to " << dest << endl; return ; } Hanoi(n - 1, src, temp, dest); // 将A柱子上n-1个盘子移到B柱子上 cout << "Move disk " << n << " from " << src << " to " << dest << endl; // 将A柱子上最后一个盘子移到C柱子上 Hanoi(n - 1, temp, dest, src); // 将B柱子上n-1个盘子移到C柱子上 } 转化为非递归算法的实现方法是,可以使用栈来存储每一个子问题的状态,以便在需要的时候恢复状态,从而实现递归算法的非递归调用。我们可以使用一个自定义结构体来存储每个问题的状态,包括盘子数量,源柱子,目标柱子和中间柱子。每当需要解决一个新的子问题时,就将其状态压入栈中,然后继续解决子问题。如果遇到栈顶问题的子问题都已经解决了,就将栈顶元素弹出栈,并将其状态恢复到上一步。具体的实现方法如下: void Hanoi(int n, char src, char dest, char temp) { stack<state> S; state init_state = {n, src, dest, temp}; S.push(init_state); while (!S.empty()) { state cur_state = S.top(); if (cur_state.n == 1) { // 如果只有一个盘子,直接将盘子移动到目标柱子 cout << "Move disk 1 from " << cur_state.src << " to " << cur_state.dest << endl; S.pop(); continue; } if (cur_state.tag == 0) { // 第一次调用该子问题,将其分解为两个子问题并压栈 state sub_state1 = {cur_state.n - 1, cur_state.src, cur_state.temp, cur_state.dest, 0}; state sub_state2 = {1, cur_state.src, cur_state.dest, cur_state.temp, 1}; state sub_state3 = {cur_state.n - 1, cur_state.temp, cur_state.dest, cur_state.src, 0}; S.push(sub_state1); S.push(sub_state2); S.push(sub_state3); cur_state.tag = 1; } else if (cur_state.tag == 1) { // 第二次调用该子问题,判断其子问题是否已全部解决 state sub_state3 = S.top(); S.pop(); state sub_state2 = S.top(); S.pop(); state sub_state1 = S.top(); S.pop(); if (sub_state3.tag == 2) { // 如果第三个子问题已经解决,则弹出栈顶元素并将状态恢复到上一步 S.pop(); continue; } if (sub_state2.tag == 2) { // 如果第二个子问题已经解决,则将第三个子问题入栈 S.push(sub_state1); S.push(sub_state3); sub_state3.tag = 0; S.push(sub_state3); } else { // 如果第一个子问题还没有解决,则将第二个子问题入栈 S.push(sub_state1); S.push(sub_state2); sub_state2.tag = 0; S.push(sub_state2); } } else { // 第三次调用该子问题,将其子问题标记为已解决 state sub_state3 = S.top(); S.pop(); sub_state3.tag = 2; S.push(sub_state3); } } } 通过以上方法,我们可以将递归算法转化为非递归算法来解决Hanoi塔问题,同时保持原有递归算法的思路和结构不变,只需要在递归调用过程中将状态保存到栈中即可。 ### 回答3: Hanoi塔是一种数学谜题,它由三个棒子和一些盘子组成,盘子从小到大放在一个棒子上,较小的盘子在较大的盘子上面。目标是将三个棒子上的所有盘子移到另一个棒子上,每次只能移动一个盘子,并且任何时刻一个大盘子不能放在一个小盘子上面。 递归算法是解决Hanoi塔问题的一种非常常见和高效的方法。递归算法基于以下思路:移动n个盘子的问题可以被分解为移动n-1个盘子和移动最大的盘子。如果我们知道如何移动n-1个盘子,我们可以将它们移到第二个棒子上,并将最大的盘子移到第三个棒子上。接下来,我们将第二个棒子上的n-1个盘子移到第三个棒子上即可。 以下是递归算法的伪代码: 1. 如果n = 1,将盘子从from移动到to 2. 否则,递归移动(n-1)个盘子到中间棒子 3. 把最后一个盘子从from移动到to 4. 递归移动(n-1)个盘子从中间棒子到to 下面是相应的Python代码: def hanoi(n, a, b, c): if n == 1: print("Move disk 1 from", a, "to", c) else: hanoi(n-1, a, c, b) print("Move disk", n, "from", a, "to", c) hanoi(n-1, b, a, c) 现在我们来看看如何将递归算法转换为非递归算法。我们可以使用栈来存储要处理的指令。每个指令包括一个要移动的盘子数,其起始棒子和目标棒子。我们在栈中插入起始指令,然后循环执行以下步骤,直到栈为空: 1. 从栈顶弹出一个指令 2. 如果指令中的盘子数为1,执行一次移动并开始下一轮循环。 3. 如果指令中的盘子数大于1,则新建三个指令,第一个指令是将n-1个盘子从起始棒子移动到目标棒子上,第二个指令是将最后一个盘子移到目标棒子,第三个指令是将n-1个盘子从中间棒子移动到目标棒子上。按顺序将这三个指令压入栈中。 下面是相应的Python代码: def hanoi_iter(n, a, b, c): stack = [(n, a, b, c)] while stack: disks, from_, to_, tmp_ = stack.pop() if disks == 1: print("Move disk 1 from", from_, "to", to_) else: stack.append((disks-1, from_, tmp_, to_)) stack.append((1, from_, to_, tmp_)) stack.append((disks-1, tmp_, to_, from_)) 递归和非递归算法都可以用来解决Hanoi塔问题。对于小的n,递归可能会更快,但是非递归算法在处理大的n时可能更有效。同时,非递归算法更易于理解和调试,因为它不会调用栈溢出问题。

相关推荐

好的,您的问题我已经收到了,首先我来回答您的问题: (1) n阶Hanoi问题递归算法的实现: //n表示要移动的圆盘数量,a,b,c表示三根柱子 void hanoi(int n,char a,char b,char c) { if(n==1) printf("%c--->%c\n",a,c); //如果只有一个盘子,直接将盘子从a柱子移动到c柱子 else { hanoi(n-1,a,c,b); //将n-1个盘子从a移动到b printf("%c--->%c\n",a,c); //将第n个盘子从a移动到c hanoi(n-1,b,a,c); //将n-1个盘子从b移动到c } } (2) n阶Hanoi问题非递归算法的实现: void hanoi(int n) { if(n<=0) return; char a='A',b='B',c='C'; //定义三个柱子 int i; stack<int>s; //定义一个栈来存储每个盘子的编号和目标位置 int p=1; for(i=1;i<=n;i++) p=p*2-1; //求出移动n个盘子需要的步骤数 for(i=n;i>=1;i--) s.push(i*10+1); //将每个盘子的编号和目标位置入栈,初始时所有盘子都在a柱子,目标位置都在c柱子 for(i=1;i<=p;i++) { int x=s.top(); s.pop(); int disk=x/10,loc=x%10; //得到该步要移动的盘子编号和目标位置 if(loc==1) //如果目标位置是a { if(disk==n) //如果该盘子是最大的盘子 printf("Move disk %d from %c to %c.\n",disk,a,b); else //否则 s.push((disk*10+2)%100+(b-'A')*10); //将该盘子和它的目标位置入栈 } else if(loc==2) //如果目标位置是b { printf("Move disk %d from %c to %c.\n",disk,a,c); s.push((disk*10)%100+(c-'A')*10); //将该盘子和它的目标位置入栈 } else if(loc==3) //如果目标位置是c { if(disk==n) //如果该盘子是最大的盘子 printf("Move disk %d from %c to %c.\n",disk,b,c); else //否则 s.push((disk*10+1)%100+(c-'A')*10); //将该盘子和它的目标位置入栈 } } } (3) 比较Hanoi问题递归算法和非递归算法的区别: Hanoi问题递归算法是一种分治算法,它通过将大问题分解成小问题来解决。递归算法没有具体的顺序,而是想要求解某个问题就会一直递归下去,直到找到解决问题的基本条件为止。而非递归算法则不同,它使用栈来模拟递归的过程,避免了函数调用所带来的时间和空间开销,非递归算法实现时采用了较多的迭代。所以,非递归算法的效率比递归算法高效,但是代码较为繁琐。 (4) 理解和调试算法3.22表达式求值: 算法3.22表达式求值可以通过将中缀表达式转换为后缀表达式的方式对表达式进行求值,它使用了栈来存储后缀表达式的中间结果,每当遇到一个操作数时,就将它压入栈中,当遇到一个操作符时,则弹出栈顶的两个操作数进行计算,并将计算结果压入栈中。最终的栈顶元素就是表达式的值。但是在实际调试的过程中,需要注意的是要注意运算符优先级的问题以及括号对表达式求值的影响。对于运算符优先级的问题,可以使用一个栈来存储操作符,每当遇到一个操作符时,就将它与栈顶操作符进行比较,如果该操作符优先级较高,则直接压入栈中,否则就将栈顶操作符弹出进行计算,并将计算结果压入栈中,直到所有的操作数和操作符都被处理完毕。而对于括号的处理,则可以使用递归的方式来处理。当遇到一个左括号时,就递归调用表达式求值函数来求解括号内的表达式,然后再将括号内的结果压入栈中。
汉诺塔是一个经典的递归问题,但也可以使用非递归算法来解决。下面是一个使用C语言实现的非递归算法: c #include <stdio.h> #include <stdlib.h> typedef struct { int n; char source, temp, dest; } State; typedef struct { State *array; int size; int top; } Stack; Stack *createStack(int size) { Stack *stack = (Stack *) malloc(sizeof(Stack)); stack->array = (State *) malloc(sizeof(State) * size); stack->size = size; stack->top = -1; return stack; } void push(Stack *stack, State state) { stack->array[++stack->top] = state; } State pop(Stack *stack) { return stack->array[stack->top--]; } void hanoi(int n, char source, char temp, char dest) { Stack *stack = createStack(n); push(stack, (State) {n, source, temp, dest}); while (stack->top >= 0) { State currentState = pop(stack); if (currentState.n == 1) { printf("Move disk from %c to %c\n", currentState.source, currentState.dest); } else { push(stack, (State) {currentState.n - 1, currentState.temp, currentState.source, currentState.dest}); push(stack, (State) {1, currentState.source, currentState.temp, currentState.dest}); push(stack, (State) {currentState.n - 1, currentState.source, currentState.dest, currentState.temp}); } } free(stack->array); free(stack); } int main() { int n; printf("Enter the number of disks: "); scanf("%d", &n); hanoi(n, 'A', 'B', 'C'); return 0; } 这个算法使用了一个栈来模拟递归的过程。首先将初始状态压入栈中,然后在每一次循环中取出栈顶状态进行处理。当只有一个盘子时,直接移动即可,否则将分解成三个子问题,分别将n-1个盘子从源柱移动到辅助柱,将最后一个盘子从源柱移动到目标柱,最后将n-1个盘子从辅助柱移动到目标柱。循环直到栈为空,即所有盘子都移动到了目标柱。 示例代码中的hanoi函数接受三个参数:n表示盘子的个数,source表示源柱,temp表示辅助柱,dest表示目标柱。在每一次移动盘子时,会打印出移动的步骤。 你可以在程序中输入想要的盘子数量,然后运行该程序来查看非递归算法的结果。
塔问题的步骤数是多少? 对于汉诺塔问题,步骤数为 2^n - 1,其中 n 为盘子的数量。通过 c 语言的非递归算法可以使用栈来实现。具体实现代码可以参考以下示例: #include <stdio.h> #include <stdlib.h> #include #define MAX_DISKS 20 typedef struct { int n, r, i, j; } Frame; typedef struct { int *data; int capacity; int top; } Stack; void stack_init(Stack *s, int capacity) { s->capacity = capacity; s->data = (int*) malloc(sizeof(int) * capacity); s->top = -1; } void stack_push(Stack *s, int value) { if (s->top == s->capacity - 1) { printf("stack overflow\n"); exit(1); } s->data[++s->top] = value; } int stack_pop(Stack *s) { if (s->top == -1) { printf("stack underflow\n"); exit(1); } return s->data[s->top--]; } void hanoi(int n) { Stack s; Frame frame; stack_init(&s, n + 1); stack_push(&s, INT_MAX); frame.n = n; frame.r = 1; while (frame.n > 0 || s.top != 0) { if (frame.n > 0) { stack_push(&s, frame.n); frame.i = 1; frame.j = 2; frame.n -= 1; } else { frame.n = stack_pop(&s); if (frame.n == INT_MAX) break; frame.r = stack_pop(&s); frame.i = 6 - frame.r - frame.i; printf("Move disk %d from rod %d to rod %d\n", frame.n, frame.i, frame.j); frame.n -= 1; frame.r = frame.i; } } } int main() { int n; printf("Enter the number of disks: "); scanf("%d", &n); hanoi(n); printf("Steps: %d\n", (1 << n) - 1); return 0; } 注意事项: - 栈的使用可以避免递归函数调用带来的额外开销。 - 栈的容量需要预估,如果没有预估到位,可能会导致栈溢出。
汉诺塔问题是经典的递归问题,它的求解过程可以用递归算法来实现。以下是汉诺塔问题的C语言递归算法分析。 1. 问题描述 汉诺塔问题是指有三根柱子A、B、C,在A柱子上从下往上按照大小顺序放置n个盘子,要求把这n个盘子移动到C柱子上,移动过程中可以借助B柱子,但是要满足以下条件: 1. 每次只能移动一个盘子; 2. 盘子不能放在比它小的盘子上面。 2. 递归实现 汉诺塔问题可以通过递归实现,具体实现过程如下: 1. 将n-1个盘子从A柱子移动到B柱子上,借助C柱子; 2. 将A柱子上最大的盘子移动到C柱子上; 3. 将n-1个盘子从B柱子移动到C柱子上,借助A柱子。 递归终止条件是只有一个盘子时直接将其从A柱子移动到C柱子上。 3. 代码实现 下面是汉诺塔问题的C语言递归算法实现代码: c #include <stdio.h> void hanoi(int n, char from, char to, char via) { if (n == 1) { printf("Move disk %d from %c to %c\n", n, from, to); } else { hanoi(n-1, from, via, to); printf("Move disk %d from %c to %c\n", n, from, to); hanoi(n-1, via, to, from); } } int main() { int n = 3; // 三个盘子 hanoi(n, 'A', 'C', 'B'); return 0; } 代码中,hanoi函数用于求解汉诺塔问题,n表示盘子的个数,from表示起始柱子,to表示目标柱子,via表示中介柱子。在函数中,如果n等于1,则直接将盘子从起始柱子移动到目标柱子上;否则,递归地将n-1个盘子从起始柱子移动到中介柱子上,然后将最大的盘子从起始柱子移动到目标柱子上,最后递归地将n-1个盘子从中介柱子移动到目标柱子上。 在main函数中,首先定义了盘子的个数n,然后调用hanoi函数求解汉诺塔问题。 4. 总结 汉诺塔问题是经典的递归问题,通过递归算法可以简便地实现其求解过程。在实现时,需要注意递归的终止条件和递归调用的顺序。
### 回答1: 汉诺塔问题可以用递归算法来解决,用C语言实现的话大概是这样: void hanoi(int n, char A, char B, char C) { if(n == 1) { printf("Move disk 1 from %c to %c\n", A, C); return; } hanoi(n-1, A, C, B); printf("Move disk %d from %c to %c\n", n, A, C); hanoi(n-1, B, A, C); } ### 回答2: 汉诺塔问题是经典的递归问题,通过使用C语言,我们可以编写递归算法来解决这个问题。 首先,我们定义一个函数hanoi来解决汉诺塔问题。该函数接受三个参数:n表示要移动的盘子的数量,start表示起始柱子,end表示目标柱子。 c #include <stdio.h> void hanoi(int n, char start, char end) { if (n == 1) { printf("从 %c 移动到 %c\n", start, end); return; } char temp = 'A' + 'B' + 'C' - start - end; // 将n-1个盘子从起始柱子移动到临时柱子 hanoi(n-1, start, temp); // 将最后一个盘子从起始柱子移动到目标柱子 printf("从 %c 移动到 %c\n", start, end); // 将n-1个盘子从临时柱子移动到目标柱子 hanoi(n-1, temp, end); } 在hanoi函数中,我们首先判断递归的终止条件,即只有一个盘子时,直接将盘子从起始柱子移动到目标柱子。否则,我们需要将n-1个盘子从起始柱子移动到临时柱子,然后将最后一个盘子从起始柱子移动到目标柱子,最后再将n-1个盘子从临时柱子移动到目标柱子。 使用以上递归算法,我们可以解决汉诺塔问题。 ### 回答3: 汉诺塔问题是一个经典的数学问题,通过使用C语言递归算法可以非常简洁地解决。汉诺塔问题的规则如下:有三根柱子,分别标记为A、B、C,初始时所有的圆盘都放在柱子A上,且按从小到大的顺序从上到下依次叠放。要求通过这三根柱子将所有的圆盘移动到柱子C上,期间可以借助柱子B辅助移动,但必须满足以下规则: 1. 每次只能移动一个圆盘。 2. 大圆盘不能放在小圆盘上面。 使用递归算法来解决汉诺塔问题可以按照以下步骤: 1. 当只有一个圆盘需要移动时,直接将它从柱子A移动到柱子C上。 2. 当有多个圆盘需要移动时,可以分解为三个步骤: a. 将除了最底下的一个圆盘外的其他圆盘从柱子A移动到柱子B上(借助柱子C)。 b. 将最底下的一个圆盘从柱子A移动到柱子C上。 c. 将之前移动到柱子B上的所有圆盘从柱子B移动到柱子C上(借助柱子A)。 以上步骤可以通过递归的方式重复,直到只有一个圆盘需要移动为止。 下面是用C语言代码实现递归算法解决汉诺塔问题的示例: c #include <stdio.h> void hanoi(int n, char A, char B, char C) { if (n == 1) { printf("Move disk 1 from %c to %c\n", A, C); return; } hanoi(n-1, A, C, B); printf("Move disk %d from %c to %c\n", n, A, C); hanoi(n-1, B, A, C); } int main() { int n = 3; // 圆盘的数量 hanoi(n, 'A', 'B', 'C'); return 0; } 上述代码中,hanoi函数接受四个参数,分别表示圆盘的数量n,起始柱子A,辅助柱子B,目标柱子C。在递归过程中,会输出每一步的移动操作。最后在main函数中调用hanoi函数开始解决汉诺塔问题。 通过递归算法解决汉诺塔问题可以很好地展示递归思想的威力,相比其他方法更加简洁高效。

最新推荐

汉诺塔递归算法--C语言

汉诺塔递归算法: 问题抽象  3个塔,n个碟子  初始:所有碟子放在1号塔,大的在底下,小的在上面  任务:把碟子移动到2号塔,顺序不变, 可用3号塔辅助  限制  每次只能移动一个碟子  总是大碟子...

城轨列车,全球市场总体规模,前14大厂商排名及市场份额

城轨列车,全球市场总体规模,前14大厂商排名及市场份额

科云光盘摆渡系统故障排查手册.docx

科云光盘摆渡系统故障排查手册.docx

代码随想录最新第三版-最强八股文

这份PDF就是最强⼋股⽂! 1. C++ C++基础、C++ STL、C++泛型编程、C++11新特性、《Effective STL》 2. Java Java基础、Java内存模型、Java面向对象、Java集合体系、接口、Lambda表达式、类加载机制、内部类、代理类、Java并发、JVM、Java后端编译、Spring 3. Go defer底层原理、goroutine、select实现机制 4. 算法学习 数组、链表、回溯算法、贪心算法、动态规划、二叉树、排序算法、数据结构 5. 计算机基础 操作系统、数据库、计算机网络、设计模式、Linux、计算机系统 6. 前端学习 浏览器、JavaScript、CSS、HTML、React、VUE 7. 面经分享 字节、美团Java面、百度、京东、暑期实习...... 8. 编程常识 9. 问答精华 10.总结与经验分享 ......

无监督视觉表示学习中的时态知识一致性算法

无监督视觉表示学习中的时态知识一致性维信丰酒店1* 元江王2*†马丽华2叶远2张驰2北京邮电大学1旷视科技2网址:fengweixin@bupt.edu.cn,wangyuanjiang@megvii.com{malihua,yuanye,zhangchi} @ megvii.com摘要实例判别范式在无监督学习中已成为它通常采用教师-学生框架,教师提供嵌入式知识作为对学生的监督信号。学生学习有意义的表征,通过加强立场的空间一致性与教师的意见。然而,在不同的训练阶段,教师的输出可以在相同的实例中显著变化,引入意外的噪声,并导致由不一致的目标引起的灾难性的本文首先将实例时态一致性问题融入到现有的实例判别范式中 , 提 出 了 一 种 新 的 时 态 知 识 一 致 性 算 法 TKC(Temporal Knowledge Consis- tency)。具体来说,我们的TKC动态地集成的知识的时间教师和自适应地选择有用的信息,根据其重要性学习实例的时间一致性。

yolov5 test.py

您可以使用以下代码作为`test.py`文件中的基本模板来测试 YOLOv5 模型: ```python import torch from PIL import Image # 加载模型 model = torch.hub.load('ultralytics/yolov5', 'yolov5s') # 选择设备 (CPU 或 GPU) device = torch.device('cuda') if torch.cuda.is_available() else torch.device('cpu') # 将模型移动到所选设备上 model.to(device) # 读取测试图像 i

数据结构1800试题.pdf

你还在苦苦寻找数据结构的题目吗?这里刚刚上传了一份数据结构共1800道试题,轻松解决期末挂科的难题。不信?你下载看看,这里是纯题目,你下载了再来私信我答案。按数据结构教材分章节,每一章节都有选择题、或有判断题、填空题、算法设计题及应用题,题型丰富多样,共五种类型题目。本学期已过去一半,相信你数据结构叶已经学得差不多了,是时候拿题来练练手了,如果你考研,更需要这份1800道题来巩固自己的基础及攻克重点难点。现在下载,不早不晚,越往后拖,越到后面,你身边的人就越卷,甚至卷得达到你无法想象的程度。我也是曾经遇到过这样的人,学习,练题,就要趁现在,不然到时你都不知道要刷数据结构题好还是高数、工数、大英,或是算法题?学完理论要及时巩固知识内容才是王道!记住!!!下载了来要答案(v:zywcv1220)。

基于对比检测的高效视觉预训练

10086⇥⇥⇥⇥基于对比检测的高效视觉预训练Ol i vierJ. He´naf f SkandaKoppula Jean-BaptisteAlayracAaronvandenOord OriolVin yals JoaoCarreiraDeepMind,英国摘要自我监督预训练已被证明可以为迁移学习提供然而,这些性能增益是以大的计算成本来实现的,其中最先进的方法需要比监督预训练多一个数量级的计算。我们通过引入一种新的自监督目标,对比检测,任务表示与识别对象级功能跨增强来解决这个计算瓶颈。该目标可提取每幅图像的丰富学习信号,从而在各种下游任务上实现最先进的传输精度,同时需要高达10少训练特别是,我们最强的ImageNet预训练模型的性能与SEER相当,SEER是迄今为止最大的自监督系统之一,它使用了1000多个预训练数据。最后,我们的目标无缝地处理更复杂图像的预训练,例如COCO中的图像,缩小了从COCO到PASCAL的监督迁移学习的差距1. 介绍自从Al

You are not allowed to push code to this project.

回答: 当你遇到"You are not allowed to push code to this project"的错误提示时,可能有几个原因。首先,你需要确保你具有操作该项目的权限。你可以检查你的git账号是否有该项目的操作权限。如果没有权限,你需要联系管理员为你添加相应的权限。其次,你可以检查你的git凭证是否正确。你可以进入"控制面板" -> "用户帐户" -> "管理您的凭证" -> "Windows凭据 / 普通凭据",查看是否存在多个git凭证。你可以编辑查看你所push的网址的凭证,确保用户名和密码是正确的。另外,你也可以尝试在控制面板的凭据管理器中删除对应配置好的git网址,

TFT屏幕-ILI9486数据手册带命令标签版.pdf

ILI9486手册 官方手册 ILI9486 is a 262,144-color single-chip SoC driver for a-Si TFT liquid crystal display with resolution of 320RGBx480 dots, comprising a 960-channel source driver, a 480-channel gate driver, 345,600bytes GRAM for graphic data of 320RGBx480 dots, and power supply circuit. The ILI9486 supports parallel CPU 8-/9-/16-/18-bit data bus interface and 3-/4-line serial peripheral interfaces (SPI). The ILI9486 is also compliant with RGB (16-/18-bit) data bus for video image display. For high speed serial interface, the ILI9486 also provides one data and clock lane and supports up to 500Mbps on MIPI DSI link. And also support MDDI interface.