- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在尝试编写骑士巡回递归算法:
int mov[8][2] = {{2,1},{2,-1},{-2,1},{-2,-1},{1,2},{-1,2},{1,-2},{-1,-2}};
typedef struct element {
int x;
int y;
struct element *prev, *next;
} node;
//adding pool to list
void dEnd(node **root, int x,int y)
{
node *pos;
pos = *root;
while(pos->next!= NULL)
pos = pos->next;
pos->next = (node *)malloc(sizeof(node));
pos->next->x=x;
pos->next->y=y;
pos->next->prev=pos;
pos->next->next=NULL;
}
void uEnd(node **root,int x,int y)
{
node *pos;
pos = *root;
while(pos->x!= x && pos->y !=y)
{
pos = pos->next;
}
pos->prev->next=NULL;
free(pos);
}
void printAll(node **root)
{
node *pos = *root;
while(pos->next)
{
printf("%d %d\n", pos->x,pos->y);
pos = pos->next;
}
}
int contains(int x,int y)
{
return(((x >= 0 ) && (x <= 7)) && ((y >= 0) && (y <= 7)));
}
//find move
int searchForMove(int x, int y, int **tab, node **list, int *number)
{
int i ;
for(i = 0; i < 8; i++)
{
int nx, ny;
nx = x + mov[i][0];
ny = y + mov[i][1];
if(contains(nx, ny) && !tab[nx][ny])
{
dEnd(list, nx, ny);
tab[nx][ny] = 1;
*number++;
if(!searchForMove(nx,ny,tab,list,number))
{
uEnd(list,nx,ny);
tab[nx][ny]=0;
*number--;
}
}
}
if(i == 7 && *number <64)
return 0;
if(*number == 64)
return 1;
}
有人可以告诉我哪里出错了吗?我已经逐步检查了哪些池算法正在添加到列表中。什么是添加 4,3 池然后 6,4 池后的大惊喜算法应该以 6,4 作为实际位置调用它自己,但我不知道为什么它以 4,3 作为实际位置调用自己。
最佳答案
OP 大部分都有。除了一些次要代码外,*number
增量/减量在 2 个地方是错误的。
int searchForMove(int x, int y, int **tab, node **list, int *number) {
...
// *number++; // This increase the pointer to the next pointer.
(*number)++; // This dereferences number and increases it.
...
// *number--;
(*number)--; // CD
工作示例。 “CD”表示我的修改
// CD
#include <assert.h>
#include <inttypes.h>
#include <stddef.h>
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
int mov[8][2] = { { 2, 1 }, { 2, -1 }, { -2, 1 }, { -2, -1 }, { 1, 2 },
{ -1, 2 }, { 1, -2 }, { -1, -2 } };
typedef struct element {
int x;
int y;
struct element *prev, *next;
} node;
//adding pool to list
void dEnd(node **root, int x, int y) {
node *pos;
pos = *root;
assert(pos); // CD
while (pos->next != NULL)
pos = pos->next;
pos->next = (node *) malloc(sizeof(node));
pos->next->x = x;
pos->next->y = y;
pos->next->prev = pos;
pos->next->next = NULL;
}
void uEnd(node **root, int x, int y) {
node *pos;
pos = *root;
while (pos->x != x && pos->y != y) {
pos = pos->next;
}
pos->prev->next = NULL;
free(pos);
}
void printAll(node **root) {
node *pos = *root;
unsigned i = 0; // CD
uint64_t mask = 0; // CD
while (pos->next) {
// printf("%d %d\n", pos->x, pos->y);
printf("%2u %d %d\n", i++, pos->x, pos->y); // CD prepend visit index.
mask |= 1llu << (pos->x + 8*pos->y); // CD accumulate visited squares
pos = pos->next;
}
printf("Mask %016" PRIX64 "\n", mask); // CD Show all locations visited
}
int contains(int x, int y) {
return (((x >= 0) && (x <= 7)) && ((y >= 0) && (y <= 7)));
}
//find move
int searchForMove(int x, int y, int **tab, node **list, int *number) {
int i;
for (i = 0; i < 8; i++) {
int nx, ny;
nx = x + mov[i][0];
ny = y + mov[i][1];
if (contains(nx, ny) && !tab[nx][ny]) {
dEnd(list, nx, ny);
tab[nx][ny] = 1;
// *number++;
(*number)++; // CD
if (!searchForMove(nx, ny, tab, list, number)) {
uEnd(list, nx, ny);
tab[nx][ny] = 0;
// *number--;
(*number)--; // CD
}
}
}
if (i == 7 && *number < 64)
return 0;
if (*number == 64)
return 1;
return 2; // CD added
}
// All added by CD
int main(int argc, char *argv[]) {
int tab0[8] = {0,0,0,0,0,0,0,0};
int tab1[8] = {0,0,0,0,0,0,0,0};
int tab2[8] = {0,0,0,0,0,0,0,0};
int tab3[8] = {0,0,0,0,0,0,0,0};
int tab4[8] = {0,0,0,0,0,0,0,0};
int tab5[8] = {0,0,0,0,0,0,0,0};
int tab6[8] = {0,0,0,0,0,0,0,0};
int tab7[8] = {0,0,0,0,0,0,0,0};
int *tab[8] = {tab0, tab1, tab2, tab3, tab4, tab5, tab6, tab7 };
node HeadNode = { 0, 0, NULL, NULL };
node *pHeadNode = &HeadNode;
int number = 0;
int result;
result = searchForMove(0, 0, tab, &pHeadNode, &number);
printAll(&pHeadNode);
return result;
}
关于c - 骑士游递归,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13689725/
我尝试运行稍微修改过的 horsemanjs 的示例代码: var Horseman = require('node-horseman'); var horseman = new Horseman()
我在 Isometric camera with THREE.js 中找到了有关如何创建(轴测)等距相机的示例,但如何创建轴测斜线? 最佳答案 您可以渲染带有倾斜的场景 cabinet perspec
我正在尝试在 horseman 的 evalute 函数中使用 promises。一个简单的例子: var Horseman = require('node-horseman'); var horse
我试图在调试期间查看 List<> 的内容。不幸的是我看不到它们,因为我在变量窗口中收到以下消息: corvalue.GetExactTypeSafe(out type). The object is
Rider IDE 通知我以下内容效率低下 transform.Translate(moveDirection * speed * Time.smoothDeltaTime); 并想将
是否有一种简单的方法可以在 Visual Studio 之外使用旧的 EF 来搭建脚手架迁移?如果可能的话,我想通过 Rider IDE 来完成。 最佳答案 对于 EF Core,您可以使用 http
在 Rider 中,当在断点处暂停时,有没有办法在调试器堆栈帧中实际显示“外部代码”? 在 Visual Studio 中,这可以轻松完成,但在 Rider 中似乎不可能。而且,是的,我启用了“exa
我试图通过更改其环境变量来修改 Linux 上 JetBrains Rider 中 .NET 项目的设置配置文件。但是,当我点击文件夹图标时,我无法点击添加、删除或修改任何环境变量。 我注意到在 Ri
只是试用 Rider 并遇到了这个问题,如果我只是构建 Xamarin Android 项目 - 它构建得非常好,但是如果我尝试运行它,它会在部署步骤失败并出现以下错误: ▼ Project Not
当我在 Jetbrains Rider EAP 21 中创建解决方案时,我在解决方案资源管理器窗口中收到“(缺少包)”错误。 然后,我尝试构建项目并获得 [MSB4057] 错误。 尽管如此,我可以通
我是一名优秀的程序员,十分优秀!