鱼C论坛

 找回密码
 立即注册
查看: 1217|回复: 3

哪里没有考虑周全?

[复制链接]
发表于 2023-12-1 11:35:38 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
QQ截图20231201113226.png

QQ截图20231201113300.png

代码:

#include <stdio.h>

int main()
{
    int bi,bj,n,m;
    scanf("%d %d %d %d",&bi,&bj,&n,&m);
    int chessboard[30][30] = {0};
    
    for (int i=0;i<=bi;i++){
        for (int j=0;j<=bj;j++){
            chessboard[i][j] = 1;
        }
    }
    chessboard[n][m] = 0;
    if (n-1>=0 && m+2<=bj)chessboard[n-1][m+2]=0;
    if (n+1<=bi && m+2<=bj)chessboard[n+1][m+2]=0;
    if (n-1>=0 && m-2>=0)chessboard[n-1][m-2]=0;
    if (n+1<=bi && m-2>=0)chessboard[n+1][m-2]=0;
    if (n+2<=bi && m+1<=bj)chessboard[n+2][m+1]=0;
    if (n+2<=bi && m-1>=0)chessboard[n+2][m-1]=0;
    if (n-2>=0 && m-1>=0)chessboard[n-2][m-1]=0;
    if (n-2>=0 && m+1<=bj)chessboard[n-2][m+1]=0;
    for (int i=0;i<=bi;i++){
        for (int j=0;j<=bj;j++){
            if (0==i && 0==j){continue;}
            if (chessboard[i][j]==0){
                continue;
            }
            if (i==0){
                chessboard[i][j] = chessboard[i][j-1];
            }
            else if (j==0){
                chessboard[i][j] = chessboard[i-1][j];
            }
            else{
                chessboard[i][j] = chessboard[i][j-1]+chessboard[i-1][j];
            }
        }
    }
    printf("%d",chessboard[bi][bj]);
    
    return 0;
}


想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-12-1 11:35:54 | 显示全部楼层
在你的代码中,有一些需要注意的地方:
1. 在声明数组chessboard时,需要指定数组的大小。例如,如果棋盘是一个n行m列的矩阵,那么你可以使用`int chessboard[n][m]`来声明一个二维数组。
2. 在for循环中,你需要将i的范围从0到n进行遍历,并在内部添加一个嵌套的循环来遍历列。例如,你可以使用两个for循环来遍历每个位置,如下所示:
for (int i=0; i<n; i++) {    for (int j=0; j<m; j++) {        // 在这里处理每个位置的逻辑    }}
3. 在处理每个位置的逻辑时,你需要根据题目要求对每个位置进行操作。但是,在你提供的代码中,没有涉及到任何关于棋盘上每个位置的具体处理逻辑。因此,你需要明确问题的要求并相应地处理每个位置。

请提供更多关于问题的具体信息以及对每个位置的处理逻辑,以便我能够为你提供更详细的帮助和代码示例。

以上回复来自 -- ChatGPT(FishC官方接口),如未能正确解答您的问题,请继续追问。

点评

你好像不能看图片?  发表于 2023-12-1 11:37
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-12-1 13:17:09 | 显示全部楼层
你的代码思路正确,不过需要一个注意的地方。

对于此题而言,路径条数可能会达到 O(C(N+M,N)),这个数量是巨大的,其数值已经远远超过了 int 的最大存储范围。所以,你应该使用更大的整数类型来表示答案,例如 C99 中添加的超长 (long long) 类型。

以下是修正后的代码:
#include <stdio.h>

int main()
{
    int bi,bj,n,m;
    scanf("%d %d %d %d",&bi,&bj,&n,&m);
    long long chessboard[30][30] = {0};
    
    for (int i=0;i<=bi;i++){
        for (int j=0;j<=bj;j++){
            chessboard[i][j] = 1;
        }
    }
    chessboard[n][m] = 0;
    if (n-1>=0 && m+2<=bj)chessboard[n-1][m+2]=0;
    if (n+1<=bi && m+2<=bj)chessboard[n+1][m+2]=0;
    if (n-1>=0 && m-2>=0)chessboard[n-1][m-2]=0;
    if (n+1<=bi && m-2>=0)chessboard[n+1][m-2]=0;
    if (n+2<=bi && m+1<=bj)chessboard[n+2][m+1]=0;
    if (n+2<=bi && m-1>=0)chessboard[n+2][m-1]=0;
    if (n-2>=0 && m-1>=0)chessboard[n-2][m-1]=0;
    if (n-2>=0 && m+1<=bj)chessboard[n-2][m+1]=0;
    for (int i=0;i<=bi;i++){
        for (int j=0;j<=bj;j++){
            if (0==i && 0==j){continue;}
            if (chessboard[i][j]==0){
                continue;
            }
            if (i==0){
                chessboard[i][j] = chessboard[i][j-1];
            }
            else if (j==0){
                chessboard[i][j] = chessboard[i-1][j];
            }
            else{
                chessboard[i][j] = chessboard[i][j-1]+chessboard[i-1][j];
            }
        }
    }
    printf("%lld",chessboard[bi][bj]);
    
    return 0;
}

在 OI (信息学竞赛)中,要使用合理的类型来存储结果和变量,超过了变量支持的最大数值则会引发溢出,从而得到错误的结果。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-23 09:30

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表