洛谷题单 思路讲解

文章讲述了两个角色cbw和zhouwc进行的一种基于模运算的游戏,玩家需要预测游戏结果,以帮助cbw确保胜利或避免平局。文章涉及到了游戏规则、解决方案(如常胜将军算法和dfs)以及作者在解决过程中的思考和教训。
摘要由CSDN通过智能技术生成

P5635 【CSGRound1】天下第一

天下第一的 cbw 以主席的身份在 8102 年统治全宇宙后,开始了自己休闲的生活,并邀请自己的好友每天都来和他做游戏。由于 cbw 想要显出自己平易近人,所以 zhouwc 虽然是一个蒟蒻,也有能和 cbw 玩游戏的机会。

题目描述

游戏是这样的:

给定两个数 x,y,与一个模数 p。

cbw 拥有数 x,zhouwc 拥有数 y。

第一个回合:x←(x+y)modp。

第二个回合:←(x+y)modp。

第三个回合:x←(x+y)modp。

第四个回合:y←(x+y)modp。

以此类推....

如果 x 先到 00,则 cbw 胜利。如果 y 先到 00,则 zhouwc 胜利。如果 x,y 都不能到 00,则为平局。

cbw 为了捍卫自己主席的尊严,想要提前知道游戏的结果,并且可以趁机动点手脚,所以他希望你来告诉他结果。

输入格式

有多组数据。

第一行:T 和 p 表示一共有 T 组数据且模数都为 p。

以下 T 行,每行两个数 x,y。

输出格式

共 T 行

1表示 cbw 获胜,2 表示 zhouwc 获胜,error 表示平局。

输入输出样例

输入 #1复制

1 10
1 3

输出 #1复制

error

输入 #2复制

1 10
4 5

输出 #2复制

1

说明/提示

1≤T≤200。

1≤x,y,p≤10000。

刚开始做这道题时想到的是常胜将军,但是做下去不对劲,我来说说我的思路,cbw获胜和zhouwc获胜很容易,只要判断每次的值时等于1还是2,但是平局该怎么判断呢?

我是这样来处理的,当执行许多次后,x,y的值又变回输入的x,y后,那么就是平局。

这样有思路后就好做了,我们来看看如何实现。

#include <stdio.h>
#include <stdlib.h>
int p;
int get_ans(int x,int y,int sx,int sy,int sum)//sx,sy,sum分别代表开始的x,y,回合数
{
    if(x==0)//cbw获胜
        return 1;
    if(y==0)//zhouwc获胜
        return 2;
    if(x==sx&&y==sy)//等于开始输入的值,平局
        return 0;
     if(sum%2==0)
        get_ans((x+y)%p,y,sx,sy,sum+1%10);//sum+1进入下一回合,%10怕回合超出范围,让它固定到10内
     else
        get_ans(x,(x+y)%p,sx,sy,sum+1%10);
}
int main()
{
    int t;
      scanf("%d%d",&t,&p);
      while(t--)//多组数据的循环
      {
          int x,y;
           scanf("%d%d",&x,&y);//输入最开始的值
           int x1=(x+y)%p;//先让x算一次,这时传过去就是开始第二回合了
           if(get_ans(x1,y,x,y,1)==1)
              printf("1\n");
           else
            if(get_ans(x1,y,x,y,1)==2)
              printf("2\n");
           else
            printf("error\n");
      }
    return 0;
}

 B3625 迷宫寻路

题目描述

机器猫被困在一个矩形迷宫里。

迷宫可以视为一个 n×m 矩阵,每个位置要么是空地,要么是墙。机器猫只能从一个空地走到其上、下、左、右的空地。

机器猫初始时位于 (1,1)(1,1) 的位置,问能否走到(n,m) 位置。

输入格式

第一行,两个正整数n,m。

接下来 n 行,输入这个迷宫。每行输入一个长为 m 的字符串,# 表示墙,. 表示空地。

输出格式

仅一行,一个字符串。如果机器猫能走到 (n,m),则输出 Yes;否则输出 No

输入输出样例

输入 #1复制

3 5
.##.#
.#...
...#.

输出 #1复制

Yes

说明/提示

样例解释

路线如下:(1,1)→(2,1)→(3,1)→(3,2)→(3,3)→(2,3)→(2,4)→(2,5)→(3,5)(1,1)→(2,1)→(3,1)→(3,2)→(3,3)→(2,3)→(2,4)→(2,5)→(3,5)

数据规模与约定

对于 100%100% 的数据,保证 1≤n,m≤100,且 (1,1)(1,1) 和 (n,m) 均为空地。

一道模版dfs题,看看代码吧

 

#include <stdio.h>
#include <stdlib.h>
char a[105][105];
int book[105][105];
int n,m;
int flag;
int next[4][2]={0,1,
                1,0,
                0,-1,
                -1,0};//四个方向
void dfs(int x,int y)
{

     if(x==n-1&&y==m-1)//到达目的的结束
     {
         printf("Yes");
         flag=1;
         return ;
     }
     int tx,ty;
     for(int i=0;i<=3;i++)//遍历四个方向
     {
         tx=x+next[i][0];
         ty=y+next[i][1];
         if(tx<0||ty<0||tx>n-1||ty>m-1)
            continue;
         if(a[tx][ty]=='.'&&book[tx][ty]==0)
         {
             book[tx][ty]=1;
             dfs(tx,ty);

         }

     }
}
int main()
{
     scanf("%d%d",&n,&m);
     for(int i=0;i<n;i++)
        scanf("%s",a[i]);
     book[0][0]=1;
     dfs(0,0);
    if(flag==0)
    {
        printf("No");
    }
    return 0;
}

当我写完dfs自信满满的交上去后,WA后直接让我懵逼,我看完题解后才知道不用回溯,我也不知道为啥,回溯会掉一个点..............累了,今天就到这吧,头大。。。。。。 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值