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后直接让我懵逼,我看完题解后才知道不用回溯,我也不知道为啥,回溯会掉一个点..............累了,今天就到这吧,头大。。。。。。