【题解】魔术棋子

题目描述

在一个M×N的魔术棋盘中,每个格子中均有一个整数,当棋子走进这个格子中,则此棋子上的数会被乘以此格子中的数。一个棋子从左上角走到右下角,只能向右或向下行动,请问此棋子走到右下角后,模(mod)K可以为几?

如以下2×3棋盘:

3 4 4

5 6 6

棋子初始数为1,开始从左上角进入棋盘,走到右下角,上图中,最后棋子上的数可能为288,432或540。所以当K=5时,可求得最后的结果为:0,2,3。

输入输出格式

输入格式

第一行为三个数,分别为M,N,K(1≤M,N,  K≤100);

以下M行,每行N个数,分别为此方阵中的数。

输出格式

第一行为可能的结果个数;

第二行为所有可能的结果(按升序输出)。

输入输出样例

输入样例

2 3 5

3 4 4

5 6 6

输出样例

3

0 2 3

题解

简单dp,三重循环暴力即可。

#include <iostream>
#include <cstdio>

#define MAX_M (100 + 5)
#define MAX_N (100 + 5)
#define MAX_C (100 + 5)

using namespace std;

int m, n, c;
int a[MAX_M][MAX_N];
int dp[MAX_M][MAX_N][MAX_C];
int ans;

int main()
{
    scanf("%d%d%d", &m, &n, &c);
    for(register int i = 1; i <= m; ++i)
    {
        for(register int j = 1; j <= n; ++j)
        {
            scanf("%d", &a[i][j]);
        }
    }
    dp[0][1][1] = 1;
    for(register int i = 1; i <= m; ++i)
    {
        for(register int j = 1; j <= n; ++j)
        {
            for(register int k = 0; k < c; ++k)
            {
                dp[i][j][k * a[i][j] % c] |=  dp[i - 1][j][k] | dp[i][j - 1][k];
            }
        }
    }
    for(register int i = 0; i < c; ++i)
    {
        ans += dp[m][n][i];
    }
    printf("%d\n", ans);
    for(register int i = 0; i < c; ++i)
    {
        if(dp[m][n][i])
        {
            printf("%d ", i);
        }
    }
    return 0;
}

参考程序

原文地址:https://www.cnblogs.com/kcn999/p/10624716.html

时间: 2024-10-18 07:41:41

【题解】魔术棋子的相关文章

洛谷 P2049 魔术棋子

P2049 魔术棋子 题目描述 在一个M*N的魔术棋盘中,每个格子中均有一个整数,当棋子走进这个格子中,则此棋子上的数会被乘以此格子中的数.一个棋子从左上角走到右下角,只能向右或向下行动,请问此棋子走到右下角后,模(mod)K可以为几? 如以下2*3棋盘: 3 4 4 5 6 6 棋子初始数为1,开始从左上角进入棋盘,走到右下角,上图中,最后棋子上的数可能为288,432或540.所以当K = 5时,可求得最后的结果为:0,2,3. 输入输出格式 输入格式: 输入文件magic.in第一行为三个

洛谷——P2049 魔术棋子

P2049 魔术棋子 题目描述 在一个M*N的魔术棋盘中,每个格子中均有一个整数,当棋子走进这个格子中,则此棋子上的数会被乘以此格子中的数.一个棋子从左上角走到右下角,只能向右或向下行动,请问此棋子走到右下角后,模(mod)K可以为几? 如以下2*3棋盘: 3 4 4 5 6 6 棋子初始数为1,开始从左上角进入棋盘,走到右下角,上图中,最后棋子上的数可能为288,432或540.所以当K = 5时,可求得最后的结果为:0,2,3. 输入输出格式 输入格式: 输入文件magic.in第一行为三个

魔术棋子

题目描述 在一个M*N的魔术棋盘中,每个格子中均有一个整数,当棋子走进这个格子中,则此棋子上的数会被乘以此格子中的数.一个棋子从左上角走到右下角,只能向右或向下行动,请问此棋子走到右下角后,模(mod)K可以为几? 如以下2*3棋盘: 3 4 4 5 6 6 棋子初始数为1,开始从左上角进入棋盘,走到右下角,上图中,最后棋子上的数可能为288,432或540.所以当K = 5时,可求得最后的结果为:0,2,3. 输入输出格式 输入格式: 输入文件magic.in第一行为三个数,分别为M,N,K

洛谷—— P2049 魔术棋子

https://www.luogu.org/problem/show?pid=2049 题目描述 在一个M*N的魔术棋盘中,每个格子中均有一个整数,当棋子走进这个格子中,则此棋子上的数会被乘以此格子中的数.一个棋子从左上角走到右下角,只能向右或向下行动,请问此棋子走到右下角后,模(mod)K可以为几? 如以下2*3棋盘: 3 4 4 5 6 6 棋子初始数为1,开始从左上角进入棋盘,走到右下角,上图中,最后棋子上的数可能为288,432或540.所以当K = 5时,可求得最后的结果为:0,2,3

【题解】棋子

题目描述 小Z在家闲得无聊,摆弄起了围棋棋子.也许是小Z有自虐倾向,他出了个难题给自己,结果竟然把自己难住了.你作为他的朋友,决定帮助他解决难题. 有一个m×n的棋盘,需要在上面摆满黑白棋子.小Z有一个奇怪的规则:如果有两个棋子相邻(上下左右),且一白一黑.则黑的必须在上面(或左边).黑白棋子都是足够多的.小Z想知道共有多少种不同的摆法(只要略有不同就算一种). 输入格式 一行,包括两个正整数m和n. 输出格式 一行,包括一个正整数ans,表示共有多少种不同的摆法. 输入样例 2 2 输出样例

bzoj 3519: [Zjoi2014] 消棋子 题解

[序言]在大家怀疑的眼光下,我做了一个中午和半个下午.调了一个晚上的题目总算A了! [原题] 消棋子是一个有趣的游戏.游戏在一个r * c的棋盘上进行.棋盘的每个格 子,要么是空,要么是一种颜色的棋子.同一种颜色的棋子恰好有两个.每一轮, 玩家可以选择一个空格子(x, y),并选择上下左右四个方向中的两个方向,如果 在这两个方向上均存在有棋子的格子,而且沿着这两个方向上第一个遇到的棋子 颜色相同,那么,我们将这两个棋子拿走,并称之为合法的操作.否则称这个操 作不合法,游戏不会处理这个操作.游戏的

[题解] [CQOI2011] 放棋子

题面 题解 为了练习计数而做 注意到一种颜色占据的行, 列其他的颜色不能放 又考虑到我们并不需要知道哪些行哪些列选了, 只需要知道还有几行几列没选即可 于是有 \(f[i][j][k]\) 代表前 \(i\) 种颜色选完之后, 还有 \(j\) 行没选, \(k\) 列没选的方案数 \(g[i][j][k]\) 代表, \(i\) 个棋子, 放在 \(j\) 行 \(k\) 列中并且没有空行空列的方案数 \(cnt_i\) 代表颜色为 \(i\) 的棋子有几个 有 \[ \displaystyl

魔术球问题弱化版 题解

此文为博主原创题解,转载时请通知博主,并把原文链接放在正文醒目位置. 我也不知道这个问题是哪里来的,所以没有题目链接...但是文末会给出几组数据. 题目描述 假设有 n 根柱子,现要按下述规则在这 n 根柱子中依次放入编号为 1,2,3,…的球. (1)每次只能在某根柱子的最上面放球. (2)在同一根柱子中,任何 2 个相邻球的编号之和为完全平方数. 试设计一个算法,计算出在 n 根柱子上最多能放多少个球. 例如,在 4 根柱子上最多可放 11 个球. 对于给定的 n,计算在 n 根柱子上最多能

【题解】CQOI2012交换棋子

感受到网络流的强大了--这道题目的关键在于: 前后颜色不变的,流入流出的次数相等:原本是黑色的最后变成了白色,流出比流入次数多1:原本是白色最后变成黑色,流入比流出次数多一.所以我们将每一点拆成3个点,分别代表流入点,原点与流出点.最开始为黑色的点与源点连流量为1,费用为0的边,最后为黑色的点与汇点连流量为1,费用为0的边. #include<bits/stdc++.h> using namespace std; #define maxn 300 #define maxm 8000 #defi