pku 1970 搜索 The Game 解题报告

本文详细解析了TheGame题目,介绍了正确的解题思路及代码实现,并总结了常见错误及应对策略。

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

一、题目:The Game;
二、题目意思:http://acm.pku.edu.cn/JudgeOnline/problem?id=1970
三、错误思想:
1、从八个方向判断;
2、没有考虑到结果为0的情况(没有读懂题意啊!);
3、数组越界;
4、没有考虑到棋子>=6的情况;
五、正确的解法:
通过自己的研究与网上查找的相关资料,终于搞定:
·#include "stdio.h"
·#include "string.h"
·
·#define max 19
·int data[25][25];
·
·int main()
·{
·
·          int n;
·          int i, j;
·          int k;
·          int key;
·          int flag;
·
·          scanf("%d",&n);
·          while (n--)
·          {  
·                    //输入棋盘的相关数字
·                    for (i = 0; i < max; i++)
·                    {
·                               for (j = 0; j < max; j++)
·                               {
·                                         scanf("%d",&data[j]);    
·                               }
·                    }
·
·                    flag = 0;       //标志,为1表示知道结果
·                    //从左向右,上到下枚举
·                    //向正下方、左下方、右下方、正右方进行测试结果
·        for (j = 0; j < max; j++)
·        {
·                               for (i = 0; i < max; i++)
·                               {
·                                         if (data[j] != 0)
·                                         {
·                                                   //正下方
·                                                   if (j + 4 < max)
·                                                   {
·                                                             //测试是否在正下方有5个相同的棋子
·                                                             for (k = 1, key = 0; k < 5; k++)
·                                                             {
·                                                                       //没有,则由key记录
·                                                                       if (data[j + k] != data[j])
·                                                                       {
·                                                                                  key = 1;
·                                                                                  break;
·                                                                       }
·                                                             }
·                                                             //当发现有5个相同的棋子时,向上1位与向下5位的情况
·                                                             if (!key && (j + 5 >= max || data[j + 5] != data[j])
·                                                                       && (j - 1 < 0 || data[j - 1] != data[j]))
·                                                             {
·                                                                       //一切都符合要求,则打印,并由flag记录
·                                                                       printf("%d/n%d %d/n", data[j], i + 1, j + 1);
·                                                                       flag = 1;
·                                                                       break;
·                                                             }
·                                                   }
·                                                   //右下方
·                                                   if (j + 4 < max && i + 4 < max)
·                                                   {
·                                                             for (k = 1, key = 0; k < 5; k++)
·                                                             {
·                                                                       if (data[j + k] != data[j])
·                                                                       {
·                                                                                  key = 1;
·                                                                                  break;
·                                                                       }
·                                                             }
·                                                             if (!key && (j + 5 >= max || i + 5 >= max || data[j + 5] != data[j])
·                                                                       && (i - 1 < 0 || j - 1 < 0 || data[j - 1] != data[j]))
·                                                             {
·                                                                       printf("%d/n%d %d/n", data[j], i + 1, j + 1);
·                                                                       flag = 1;
·                                                                       break;
·                                                             }
·                                                   }
·                                                   //正右方
·                                                   if (i + 4 < max)
·                                                   {
·                                                             for (k = 1, key = 0; k < 5; k++)
·                        {
·                                                                       if (data[j] != data[j])
·                                                                       {
·                                                                                  key = 1;
·                                                                                  break;
·                                                                       }
·                                                             }
·                                                             if (!key && (i + 5 >= max || data[j] != data[j])
·                                                                       && (i - 1 < 0 && data[j] != data[j]))
·                                                             {
·                                                                       printf("%d/n%d %d/n", data[j], i + 1, j + 1);
·                                                                       flag = 1;
·                                                                       break;
·                                                             }
·                                                   }
·                                                   //左下方
·                                                   if (j + 4 < max && i - 4 >= 0)
·                                                   {
·                                                             for (k = 1, key = 0; k < 5; k++)
·                        {
·                                                                       if (data[j + k] != data[j])
·                                                                       {
·                                                                                  key = 1;
·                                                                                  break;
·                                                                       }
·                                                             }
·                                                             if (!key && (j + 5 >= max || i - 5 < 0 || data[j + 5] != data[j])
·                                                                       && (i + 1 >= max || j - 1 < 0 || data[j - 1] != data[j]))
·                                                             {
·                                                                       printf("%d/n%d %d/n", data[j], i + 1, j + 1);
·                                                                       flag = 1;
·                                                                       break;
·                                                             }
·                                                   }
·                                         }
·                               }
·                               if (flag)
·                               {
·                                         break;
·                               }
·                    }
·                    if (j == max)
·                    {
·                               printf("0/n");
·                    }
·          }
·
·          return 0;
·}
六、Memory:176k Time: 0Ms
七、总结自己容易犯的错误:
1、没有读懂题意;
2、数组越界问题;(以后一定要注意c语言的数组下标是从0开始的)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值