C 棋盘游戏…但不同的一个

C 棋盘游戏…但不同的一个,c,algorithm,game-theory,C,Algorithm,Game Theory,我曾以以下方式尝试上述问题,但答案被评估为错误。我不是要求解决方案,而是要求方法中的缺陷 我的代码请忽略c99错误 #include <stdio.h> #include <string.h> #include <math.h> #include <stdlib.h> int numofmov = 0; int issafe(int a,int b){ if(a>=0 && a<15 && b&g

我曾以以下方式尝试上述问题,但答案被评估为错误。我不是要求解决方案,而是要求方法中的缺陷

我的代码请忽略c99错误

#include <stdio.h>
#include <string.h>
#include <math.h>
#include <stdlib.h>
int numofmov = 0;
int issafe(int a,int b){
    if(a>=0 && a<15 && b>=0 && b<15)
        return 1;
    return 0;
}
void move(int board[][15]){
    for(int i=0;i<15;i++){
        for(int j=0;j<15;j++){
            if(board[i][j]>0){
                board[i][j]--;
                if(issafe(board,i-2,j+1)==1) {
                    numofmov++;
                    board[i-2][j+1]++;
                }
                if(issafe(board,i-2,j-1)==1) {
                    numofmov++;
                    board[i-2][j-1]++;
                }                
                if(issafe(board,i+1,j-2)==1) {
                    numofmov++;
                    board[i+1][j-2]++;
                }
                if(issafe(board,i-1,j-2)==1) {
                    numofmov++;
                    board[i-1][j-2]++;
                }
            }
        }
    }
}
int main() {

    /* Enter your code here. Read input from STDIN. Print output to STDOUT */  
    int t;
    scanf("%d",&t);
    while(t--){
        int k;
        scanf("%d",&k);
        int board[15][15];
        for(int j=0;j<15;j++){
            for(int h=0;h<15;h++){
                board[j][h]=0;
            }
        }
        for(int i=0;i<k;i++){
            int x,y;
            scanf("%d %d",&x,&y);
            board[x-1][y-1]++;
        }
        int bro=0,mov=numofmov;
        while(bro==0){
            move(board);
            if(numofmov==mov){
                bro++;
                printf("Second\n");
                break;
            }
            mov = numofmov;
            move(board);
            if(numofmov==mov){
                bro++;
                printf("First\n");
                break;
            }
            mov = numofmov;
        }
    }
    return 0;
}

我的方法是继续使所有硬币的所有移动都成为可能,直到我们到达一个不可能移动的点。但在某些测试案例中,这会给出错误的答案。

您会问这种方法有什么问题

我的方法是继续让所有的动作都成为可能 直到我们到达一个无法移动的点。但这是 在某些测试案例中给出错误答案

我没有读过你的代码,但我可以说主要的问题是你的方法本身。您将此问题视为一种蛮力,使所有可能的移动路径,并查看谁将获胜。可能的移动次数可以任意大,检查是否移动导致赢是无限慢的。实际上,这要么是动态规划问题,要么是更相关的博弈论问题。 这样想吧。起跑位置是否唯一地确定了这场比赛的胜利者?如果我改变一枚硬币的初始位置,赢家也会改变吗


解决这类问题的最佳方法是简化它。假设只有一块板和一枚硬币,位于x,y。现在请注意,在硬币从位置x,y移动到位置a,b之后,下面的a+b是正确的。我们的问题完全依赖于链接。链接可能会随着时间的推移而中断,因此最好在问题中包含相关的代码和引号。链接中有我的代码……它是否工作?是的,对不起,我有点太快了。我在问题中添加了你的代码。我还拿走了C++标签,因为它看起来像是直C。如果你解释你遇到的问题,它将改善你的问题。谢谢@保罗·鲁尼出于好奇,把板球传给伊萨菲有什么意义?好像少了什么东西。。。比如说检查黑板。