2024电赛E题最后一问解题思路

最后一问是:(6)对弈过程中,若人将装置下过的1颗棋子变动位置,装置能自动发现并将该棋子放置回原来位置。(10分)

首先在每个回合的时候判断是否变动棋子位置,那首先可以判断棋子数量,如果数量相同说明变动了位置,如何在遍历每个棋子进行对比。具体实现如下:

void fun(int *a,Board board,int *coor){
int n1,n2;
n1=n2=0;
//首先计算棋子数
for(int i=0;i<9;i++)
    if(a[i]==0||a[i]==1)
        n1++;
 for(int i=0;i<SIZE;i++)       
    for(int j=0;j<SIZE;j++)
        if(board[i][j]==0||board[i][j]==1)
            n2++;
 //如果棋子数一样,说明移动了。           
 if(n1!=n2)
     return;
  else
     for(int i=0;i<SIZE;i++)  //循环遍历每一个棋子,判断于原来状态是否相同。     
         for(int j=0;j<SIZE;j++)
             {
                 if(board[i][j]!=a[3*i+j])//不相同说明该棋子位置变化
                     {
                         if(board[i][j]==3&&a[3*i+j]!=3)//判断现在棋子在什么位置
                             {
                                 coor[0]=i;
                                 coor[1]=j;
                             }
                         else//找到他之前的位置
                             {
                                 coor[2]=i;
                                 coor[3]=j;
                             }    
                     }
             }
 return;            
}

这个函数就能实现是否变动位置并找出变动后的坐标和原来的坐标。我们可以测试一下:

#include<stdio.h>
typedef int Board [3][3];
#define SIZE 3
Board board={
{3,3,3},
{3,3,3},
{3,3,3}
};
int a[9]={3,3,3,3,3,3,3,3,3};
void fun(int *a,Board board,int *coor){
int n1,n2;
n1=n2=0;
//首先计算棋子数
for(int i=0;i<9;i++)
    if(a[i]==0||a[i]==1)
        n1++;
 for(int i=0;i<SIZE;i++)       
    for(int j=0;j<SIZE;j++)
        if(board[i][j]==0||board[i][j]==1)
            n2++;
 //如果棋子数一样,说明移动了。           
 if(n1!=n2)
     return;
  else
     for(int i=0;i<SIZE;i++)  //循环遍历每一个棋子,判断于原来状态是否相同。     
         for(int j=0;j<SIZE;j++)
             {
                 if(board[i][j]!=a[3*i+j])//不相同说明该棋子位置变化
                     {
                         if(board[i][j]==3&&a[3*i+j]!=3)//判断现在棋子在什么位置
                             {
                                 coor[0]=i;
                                 coor[1]=j;
                             }
                         else//找到他之前的位置
                             {
                                 coor[2]=i;
                                 coor[3]=j;
                             }    
                     }
             }
 return;            
}
int main()
{
    int coor[4];
    printf("输入原棋盘状态:\n");
    for(int i=0;i<SIZE;i++)       
        for(int j=0;j<SIZE;j++)
            scanf("%d",&board[i][j]);
    printf("输入移动后的棋盘状态:\n");
    for(int i=0;i<9;i++) 
        scanf("%d",&a[i]);
    fun(a,board,coor);
    printf("请将(%d,%d)棋子移动到(%d,%d)处\n",coor[0]+1,coor[1]+1,coor[2]+1,coor[3]+1);           
    return 0;
}

测试结果如下:

  • 15
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值