- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
这个问题被称为八皇后问题(将 8 个皇后放在 8 x 8 的棋盘上,这样它们就不能互相攻击/威胁)。我在 C 中有以下解决方案,它使用递归来打印所有可能的解决方案。我想让它成为非递归的,但我遇到了麻烦,所以我直接将它翻译成 MIPS..
不过,我还是更愿意让它成为非递归的。
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
int attack(int i, int j, int col, int* hist)
{
return (hist[j] == i) || (abs(hist[j] - i) == (col - j));
}
int solve(int n, int col, int *hist)
{
if (col == n)
{
putchar('\n');
for (int i = 0; i < n; ++i)
{
for (int j = 0; j < n; ++j)
{
if (hist[i] == j)
{
putchar('Q');
}
else if((i + j) & 1)
{
putchar(' ');
}
else
{
putchar(178);
}
}
putchar('\n');
}
return 0;
}
for (int i = 0, j = 0; i < n; ++i)
{
for (j = 0; j < col; ++j)
{
if (attack(i, j, col, hist) != 0)
break;
}
if (j < col) continue;
hist[col] = i;
solve(n, col + 1, hist);
}
return 0;
}
int main()
{
int hist[8];
solve(8, 0, hist);
}
结果是(一种可能的解决方案):
现在我需要将它翻译成 mips,我有:
#include <mips.h>
.data
new_line: .asciiz "\n"
new_lines: .asciiz "\n\n\n"
black_sq: .asciiz "B"
white_sq: .asciiz "W"
queen_sq: .asciiz "Q"
hist: .word 0, 0, 0, 0, 0, 0, 0, 0
i_p: .asciiz "I: "
j_p: .asciiz " J: "
.text
.globl main
main:
subiu $sp, $sp, 32
sw $ra, 28($sp)
sw $fp, 24($sp)
sw $s0, 20($sp)
sw $s1, 16($sp)
#store stack-frame: end.
li $a0, 8
li $a1, 0
la $a2, hist
jal solve
#restore stack-frame: beg.
sw $s1, 16($sp)
sw $s0, 20($sp)
lw $fp, 24($sp)
lw $ra, 28($sp)
addiu $sp, $sp, 32
li $v0, 10
syscall
#solve(n, col, hist)
solve:
subiu $sp, $sp, 32
sw $ra, 28($sp)
sw $a0, 24($sp)
sw $a1, 20($sp)
sw $a2, 16($sp)
bne $a1, $a0, solve_atk
li $v0, 4
la $a0, new_lines
syscall
lw $a0, 24($sp)
li $t0, 0 #i = 0
solve_for_1:
beq $t0, $a0, solve_for_1_end
li $t1, 0 #j = 0
solve_for_2:
beq $t1, $a0, solve_for_2_end
sll $t2, $t0, 2 #ri = i * sizeof(int)
add $t2, $t2, $a2
lw $t2, 0($t2) #hist[i]
bne $t2, $t1, solve_for_2_else_if
la $a0, queen_sq #putchar('Q')
j solve_for_2_if_end
solve_for_2_else_if:
add $t2, $t1, $t0
andi $t3, $t2, 1
beqz $t3, solve_for_2_else
la $a0, white_sq #putchar(' ')
j solve_for_2_if_end
solve_for_2_else:
la $a0, black_sq #putchar(¦)
solve_for_2_if_end:
li $v0, 4
syscall
lw $a0, 24($sp)
addiu $t1, $t1, 1 #++j
j solve_for_2
solve_for_2_end:
li $v0, 4
la $a0, new_line #putchar('\n')
syscall
lw $a0, 24($sp)
addiu $t0, $t0, 1 #++i
j solve_for_1
solve_for_1_end:
addiu $sp, $sp, 32
jr $ra #return;
solve_atk:
li $t3, 0 #i = 0
solve_atk_for_1:
beq $t3, $a0, solve_atk_for_1_end
li $t4, 0 #j = 0
solve_atk_for_2:
beq $t4, $a1, solve_atk_for_2_end
move $a3, $a2 #hist
move $a2, $a1 #col
move $a1, $t4 #j
move $a0, $t3 #i
jal attack #v0 = attack(i, j, col, hist);
lw $a2, 16($sp)
lw $a1, 20($sp)
lw $a0, 24($sp)
lw $ra, 28($sp)
beqz $v0, solve_atk_for_2_end #if (attack(i, j, col, hist) != 0) break;
addiu $t4, $t4, 1
j solve_atk_for_2
solve_atk_for_2_end:
blt $t4, $a1, solve_atk_for_1_continue #if (j < col) continue;
sll $t0, $a1, 2 #ri = col * sizeof(int)
add $t0, $t0, $a2
sw $t3, 0($t0) #hist[col] = i
lw $a2, 16($sp)
lw $a1, 20($sp)
lw $a0, 24($sp)
lw $ra, 28($sp)
addiu $a1, $a1, 1 #solve(i, col + 1, hist)
jal solve
solve_atk_for_1_continue:
addiu $t3, $t3, 1 #++i
j solve_atk_for_1
solve_atk_for_1_end:
lw $a2, 16($sp)
lw $a1, 20($sp)
lw $a0, 24($sp)
lw $ra, 28($sp)
addiu $sp, $sp, 32
jr $ra
#attack(i, j, col, hist)
attack:
sll $t0, $a1, 2 #ri = j * sizeof(int)
add $t0, $t0, $a3
lw $t0, 0($t0) #hist[j]
sub $a3, $t0, $a0
li $v0, 0
beqz $a3, attack_or #if hist[j] != i
li $v0, 1 #return true.
j attack_done
attack_or:
abs $a3, $a3
sub $t0, $a2, $a0
bne $t0, $a3, attack_done
li $v0, 1
attack_done:
jr $ra
abs:
sra $t1, $t0, 31
xor $t0, $t0, $t1
sub $v0, $t0, $t1
jr $ra
但是它打印出错误的结果。我怀疑这是由于递归,因为我之前测试了所有代码:
solve_atk
和 solve_atk
之后的所有代码分开,它与 C 代码完全一样。据我所知,问题是递归。
知道我做错了什么吗?对于那些不能阅读 MIPs 程序集的人,没有递归的“C”解决方案(与我的相同)也可以(我可以自己翻译)。
有什么想法或解决方案吗?
最佳答案
The problem is then the recursion as far as I can tell.
这确实是主要问题。您在调用 solve
时忽略了这一点递归地,寄存器 $a1
和 $t3
被修改(前者由您的调用代码修改,后者由被调用的 solve
实例修改),而在调用后仍然需要它们的原始值。您可以通过更改来纠正此问题
addiu $a1, $a1, 1 #solve(i, col + 1, hist)
jal solve
到
addiu $a1, $a1, 1 #solve(i, col + 1, hist)
sw $t3, 12($sp) # save $t3
jal solve
lw $t3, 12($sp) # restore $t3
addiu $a1, $a1, -1 # restore $a1
除此之外,还有一些小错误:
beqz $v0, solve_atk_for_2_end #if (attack(i, j, col, hist) != 0) break;
必须是bnez $v0, solve_atk_for_2_end #if (attack(i, j, col, hist) != 0) break;
beqz $a3, attack_or #if hist[j] != i
必须是bnez $a3, attack_or #if hist[j] != i
sub $t0, $a2, $a0
(在 attack_or:
之后)必须是sub $t0, $a2, $a1
( $a0
是 i
,而我们需要 $a1
, j
在 (col - j)
中)。关于c - 从 C 递归错误输出的 Mips 翻译,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27337071/
#include using namespace std; class C{ private: int value; public: C(){ value = 0;
这个问题已经有答案了: What is the difference between char a[] = ?string?; and char *p = ?string?;? (8 个回答) 已关闭
关闭。此题需要details or clarity 。目前不接受答案。 想要改进这个问题吗?通过 editing this post 添加详细信息并澄清问题. 已关闭 7 年前。 此帖子已于 8 个月
除了调试之外,是否有任何针对 c、c++ 或 c# 的测试工具,其工作原理类似于将独立函数复制粘贴到某个文本框,然后在其他文本框中输入参数? 最佳答案 也许您会考虑单元测试。我推荐你谷歌测试和谷歌模拟
我想在第二台显示器中移动一个窗口 (HWND)。问题是我尝试了很多方法,例如将分辨率加倍或输入负值,但它永远无法将窗口放在我的第二台显示器上。 关于如何在 C/C++/c# 中执行此操作的任何线索 最
我正在寻找 C/C++/C## 中不同类型 DES 的现有实现。我的运行平台是Windows XP/Vista/7。 我正在尝试编写一个 C# 程序,它将使用 DES 算法进行加密和解密。我需要一些实
很难说出这里要问什么。这个问题模棱两可、含糊不清、不完整、过于宽泛或夸夸其谈,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开,visit the help center . 关闭 1
有没有办法强制将另一个 窗口置于顶部? 不是应用程序的窗口,而是另一个已经在系统上运行的窗口。 (Windows, C/C++/C#) 最佳答案 SetWindowPos(that_window_ha
假设您可以在 C/C++ 或 Csharp 之间做出选择,并且您打算在 Windows 和 Linux 服务器上运行同一服务器的多个实例,那么构建套接字服务器应用程序的最明智选择是什么? 最佳答案 如
你们能告诉我它们之间的区别吗? 顺便问一下,有什么叫C++库或C库的吗? 最佳答案 C++ 标准库 和 C 标准库 是 C++ 和 C 标准定义的库,提供给 C++ 和 C 程序使用。那是那些词的共同
下面的测试代码,我将输出信息放在注释中。我使用的是 gcc 4.8.5 和 Centos 7.2。 #include #include class C { public:
很难说出这里问的是什么。这个问题是含糊的、模糊的、不完整的、过于宽泛的或修辞性的,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开它,visit the help center 。 已关
我的客户将使用名为 annoucement 的结构/类与客户通信。我想我会用 C++ 编写服务器。会有很多不同的类继承annoucement。我的问题是通过网络将这些类发送给客户端 我想也许我应该使用
我在 C# 中有以下函数: public Matrix ConcatDescriptors(IList> descriptors) { int cols = descriptors[0].Co
我有一个项目要编写一个函数来对某些数据执行某些操作。我可以用 C/C++ 编写代码,但我不想与雇主共享该函数的代码。相反,我只想让他有权在他自己的代码中调用该函数。是否可以?我想到了这两种方法 - 在
我使用的是编写糟糕的第 3 方 (C/C++) Api。我从托管代码(C++/CLI)中使用它。有时会出现“访问冲突错误”。这使整个应用程序崩溃。我知道我无法处理这些错误[如果指针访问非法内存位置等,
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以便用事实和引用来回答。 关闭 7 年前。
已关闭。此问题不符合Stack Overflow guidelines 。目前不接受答案。 要求我们推荐或查找工具、库或最喜欢的场外资源的问题对于 Stack Overflow 来说是偏离主题的,因为
我有一些 C 代码,将使用 P/Invoke 从 C# 调用。我正在尝试为这个 C 函数定义一个 C# 等效项。 SomeData* DoSomething(); struct SomeData {
这个问题已经有答案了: Why are these constructs using pre and post-increment undefined behavior? (14 个回答) 已关闭 6
我是一名优秀的程序员,十分优秀!