五子棋问题

本文介绍了如何使用算法随机生成五子棋问题。程序通过依次生成相邻坐标的五组数来模拟棋盘上的棋子布局,直到形成一条直线。详细阐述了代码实现过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

随即生成五子棋问题:

题目描述如下:每次生成一组术随机数作为五子棋中的坐标位置,第二组数与第一组相邻,第三组、第四组、第五组分别为前两组组成的直线上的点,直到生成的五组坐标相邻,程序结束。

代码如下:

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <time.h>
#define MAX 10
int chess[MAX][MAX];  //棋盘
int r[5][2];   //存储结果
int a,b;   //行列 y = a*x + b
int len;   //当前满足要求点的个数
//初始化棋盘
void init()
{
    int i,j;
    for(i=0; i<MAX; i++)
    {
        for(j=0; j<MAX; j++)
        {
            chess[i][j] = 0;
        }
    }
}
int Judge1(int c,int d)
{
    int m,n;
    //  int flag=0;
    m = r[0][0];
    n = r[0][1];

    // m = abs(c-r[0][0]);
    // n = abs(d-r[0][1]);
    if( (c==m-1&&d==n-1) || (c==m+1&&d==n+1) || (c==m+1&&d==n-1)
            || (c==m-1&&d==n+1) || (c==m&&d==n-1) || (c==m&&d==n+1)
            ||(c==m-1&&d==n) || (c==m+1&&d==n) )
        return 0; //相邻
    else return 1; //不相邻
}
//确定斜率参数
void direction()
{
    int x1,x2,y1,y2;
    x1=r[0][0];
    y1=r[0][1];
    x2=r[1][0];
    y2=r[1][1];
    if(x1==x2)
    {
        a=-100;
        b=0;
    }
    else
    {
        a=(y1-y2)/(x1-x2);
        b=y1-a*x1;
    }
}
int Judge2(int c,int d)
{
    int i,m,n;
    if(chess[c][d] == 1)
        return 1;  //此处已经下过
    else if(a!=-100 && a*c+b != d)
        return 1;  //不在一条直线上
    else if(a==-100 && c != r[0][0])
        return 1;
    else
    {
        for(i=0; i<len; i++)
        {
            m = r[i][0];
            n = r[i][1];
            if( (c==m-1&&d==n-1) || (c==m+1&&d==n+1) || (c==m+1&&d==n-1)
                    || (c==m-1&&d==n+1) || (c==m&&d==n-1) || (c==m&&d==n+1)
                    ||(c==m-1&&d==n) || (c==m+1&&d==n) )
                return 0;  //相邻
        }
    }
    return 1;
}
int main()
{
    int m,n,i;
    srand(time(NULL));

    init();
    m = rand() % MAX + 1;
    n = rand() % MAX + 1;
    r[0][0] = m;
    r[0][1] = n;
    chess[m][n] = 1;   //标记改坐标已经下过棋子
    len=1;
    printf("(%d,%d)\n",m,n);

    //判断第二组数是否与第一组数相邻
    while(Judge1(m,n))
    {
        m = rand() % MAX + 1;
        n = rand() % MAX + 1;
    }
    printf("(%d,%d)\n",m,n);
    r[1][0] = m;
    r[1][1] = n;
    chess[m][n] = 1;
    len=2;
    direction();
    //判断第二组数是否与第一组数相邻
    for(i=0; i<3; i++)
    {
        m = rand() % MAX + 1;
        n = rand() % MAX + 1;

        while(Judge2(m,n))
        {
            m = rand() % MAX + 1;
            n = rand() % MAX + 1;
        }
        len++;
        chess[m][n] = 1;
        printf("(%d,%d)\n",m,n);
        r[i+2][0] = m;
        r[i+2][1] = n;
    }
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值