Java教程

天下第一

本文主要是介绍天下第一,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

P5635 【CSGRound1】天下第一 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

  • 误区:第一次记录用的数组开三层,分别表示x,y,和第几回合的最终答案(分别代表谁赢),但空间始终过大了
  • 第三层可以不用,因为对于某两个连续的回合(1,2     3,4)只可能有一个能赢,所以完全不需要第三层
  • 对于平局的处理:每次dfs进去之间先把ans数组标记,如果又回到相同的x,y值,那么代表这个比赛是一直循环没有结果的直接返回平局
  • 其他就按记忆化搜索做,有答案直接返回答案,没答案就先判断是不是到比赛终点了,如果是就标记输出,不是就按题目要求处理再往dfs递归
#include <bits/stdc++.h>
using namespace std;
#define MAX 10001
int t, mod;
short ans[MAX][MAX];
short dfs(int x, int y)
{
    if (ans[x][y] == -1)
    {
        printf("error\n");
        return -1;
    }
    if (ans[x][y])
    {
        printf("%d", ans[x][y]);
        return ans[x][y];
    }
    if (x == 0)
    {
        printf("1\n");
        ans[x][y] = 1;
        return 1;
    }
    else if (y == 0)
    {
        printf("2\n");
        ans[x][y] = 2;
        return 2;
    }
    ans[x][y] = -1;
    ans[x][y] = dfs((x + y) % mod, ((x + y) % mod + y) % mod);
    return ans[x][y];
}
int main()
{
    cin >> t >> mod;
    int x, y;
    while (t--)
    {
        ans[x][y] = -1;
        scanf("%d%d", &x, &y);
        ans[x][y] = dfs(x, y);
    }
}

 

这篇关于天下第一的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!