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,K (1 ≤ M,N,K ≤ 100)以下M行,每行N个数,分别为此方阵中的数。

输出格式:

输出文件magic.out第一行为可能的结果个数

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

输入输出样例

输入样例#1:

Magic.in
2 3 5
3 4 4
5 6 6
输出样例#1:

3
0 2 3
#include<queue>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
priority_queue<int,vector<int>,greater<int> >q;
][];
][],vis[];
]={,},yy[]={,};
int read()
{
    ,f=; char ch=getchar();
    ; ch=getchar();}
    +ch-'; ch=getchar();}
    return x*f;
}
void dfs(int x,int y,int s)
{
    if(x==n&&y==m)
    {
        if(vis[s]) return ;
        vis[s]=true,ans++;
        q.push(s);return ;
    }
    ;i<;i++)
    {
        int fx=x+xx[i],fy=y+yy[i];
        &&fy>&&fx<=n&&fy<=m&&!vist[fx][fy])
        {
            vist[fx][fy]=true;
            dfs(fx,fy,(s*a[fx][fy])%mod);
            vist[fx][fy]=false;
        }
    }
}
int main()
{
    n=read(),m=read(),mod=read();
    ;i<=n;i++)
     ;j<=m;j++)
       a[i][j]=read(),a[i][j]%=mod;
    dfs(,,a[][]);
    printf("%d\n",ans);
    while(!q.empty())
    {
        n=q.top();
        q.pop();
        printf("%d ",n);
    }
    ;
}

20分TLE的dfs

#include<queue>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
][];
]={,},yy[]={,};
][][],vis[];
priority_queue<int,vector<int>,greater<int> >q;
int read()
{
    ,f=; char ch=getchar();
    ; ch=getchar();}
    +ch-'; ch=getchar();}
    return x*f;
}
void dfs(int x,int y,int s)
{
    if(x==n&&y==m)
    {
        if(vis[s]) return ;
        vis[s]=true,ans++;
        q.push(s);return ;
    }
    if(vist[x][y][s]) return ;
    vist[x][y][s]=true;
    ;i<;i++)
    {
        int fx=x+xx[i],fy=y+yy[i];
        &&fy>&&fx<=n&&fy<=m)
            dfs(fx,fy,(s*a[fx][fy])%mod);
    }
//    vist[x][y][s]=false;
}
int main()
{
    n=read(),m=read(),mod=read();
    ;i<=n;i++)
     ;j<=m;j++)
       a[i][j]=read(),a[i][j]%=mod;
    dfs(,,a[][]);
    printf("%d\n",ans);
    while(!q.empty())
    {
        n=q.top();
        q.pop();
        printf("%d ",n);
    }
    ;
}

AC的记忆化搜索

#include<queue>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
][][];
][];
int read()
{
    ,f=; char ch=getchar();
    ; ch=getchar();}
    +ch-'; ch=getchar();}
    return x*f;
}
int main()
{
    n=read(),m=read(),k=read();
    ;i<=n;i++)
     ;j<=m;j++)
       a[i][j]=read(),a[i][j]%=k;
    dp[][][a[][]]=true;
    ;i<=n;i++)
     ;j<=m;j++)
      ;s<k;s++)
       if(!dp[i][j][s*a[i][j]%k])
        dp[i][j][s*a[i][j]%k]=dp[i][j-][s]||dp[i-][j][s];
    ;i<k;i++)
     if(dp[n][m][i]) ans++;
    printf("%d\n",ans);
    ;i<k;i++)
     if(dp[n][m][i])
      printf("%d ",i);
    ;
}

dp

洛谷——P2049 魔术棋子的更多相关文章

  1. 洛谷 P2049 魔术棋子

    P2049 魔术棋子 题目描述 在一个M*N的魔术棋盘中,每个格子中均有一个整数,当棋子走进这个格子中,则此棋子上的数会被乘以此格子中的数.一个棋子从左上角走到右下角,只能向右或向下行动,请问此棋子走 ...

  2. 洛谷—— P2049 魔术棋子

    https://www.luogu.org/problem/show?pid=2049 题目描述 在一个M*N的魔术棋盘中,每个格子中均有一个整数,当棋子走进这个格子中,则此棋子上的数会被乘以此格子中 ...

  3. 洛谷 P2049 魔术棋子(vector)

    题目传送门 解题思路: 用一个vector维护每一个点都可以乘出哪些数来,然后将(n,m)的所有数从小到大输出即可. 要用一个bool ff[j][k]来维护当前这个点(i,j)里面有没有被放过k,以 ...

  4. P2049 魔术棋子

    题目描述 在一个M*N的魔术棋盘中,每个格子中均有一个整数,当棋子走进这个格子中,则此棋子上的数会被乘以此格子中的数.一个棋子从左上角走到右下角,只能向右或向下行动,请问此棋子走到右下角后,模(mod ...

  5. 洛谷P3158 放棋子 [CQOI2011] dp+数论

    正解:dp+数论 解题报告: 传送门! 考虑对每种颜色的棋子单独考虑鸭,那显然有,当某一行或某一列已经被占据的时候,那一行/一列就不能再放别的颜色的棋子了,相当于直接把那一行/一列直接消了 显然就能考 ...

  6. 洛谷 P2765 魔术球问题 解题报告

    P2765 魔术球问题 题目描述 问题描述: 假设有\(n\)根柱子,现要按下述规则在这\(n\)根柱子中依次放入编号为\(1,2,3,\dots\)的球. \((1)\) 每次只能在某根柱子的最上面 ...

  7. 洛谷 P2765 魔术球问题 (dinic求最大流,最小边覆盖)

    P2765 魔术球问题 题目描述 «问题描述: 假设有n根柱子,现要按下述规则在这n根柱子中依次放入编号为1,2,3,...的球. (1)每次只能在某根柱子的最上面放球. (2)在同一根柱子中,任何2 ...

  8. 洛谷 [P2765] 魔术球问题

    贪心做法 每次尽可能选择已经放过球的柱子 #include <iostream> #include <cstdio> #include <cstring> #inc ...

  9. 洛谷P3159 交换棋子 神奇的网络流

    神奇的建模...原题链接 如果你真的把交换看成交换,就\(GG\)了.首先我们要把交换看成是白棋的移动. 然后,很容易的就想到建模的大致思路:建立超级源点S和超级汇点T,从S向初始局面每个白棋所在的格 ...

随机推荐

  1. PAT (Basic Level) Practise (中文)-1035. 插入与归并(25)

    PAT (Basic Level) Practise (中文)-1035. 插入与归并(25)   http://www.patest.cn/contests/pat-b-practise/1035 ...

  2. 洛谷 P3958 奶酪

    谨以此题来纪念我爆炸的NOIp2017 这个题虽然很多人说是并查集,但是搜索也是毫无压力的,考场搜索细节写挂,爆了个不上不下的80分.今天无意看到这道题,终于AC 首先这道题要考虑一下精度问题,虽然出 ...

  3. ECMAScript 继承机制实现

    继承机制的实现 要用 ECMAScript 实现继承机制,您可以从要继承的基类入手.所有开发者定义的类都可作为基类.出于安全原因,本地类和宿主类不能作为基类,这样可以防止公用访问编译过的浏览器级的代码 ...

  4. bzoj3545 [ONTAK2010]Peaks、bzoj3551 [ONTAK2010]Peaks加强版

    题目描述: bzoj3545,luogu bzoj3551 题解: 重构树+线段树合并. 可以算是板子了吧. 代码(非强制在线): #include<cstdio> #include< ...

  5. rom bist scripts

    rom bist 的input 有rom_content file .校验rom还坏,主要通过signature比较.signature跟rom content file 一一对应的. rom bis ...

  6. PyCharm学习笔记(二) 调试配置

    选择PyCharm编译器 注意工程默认使用的解释器可能是Pycharm自带的,而不是单独安装的.

  7. 关于Powershell执行时的问题

    问题1: [问题描述] 使用Invoke-Command命令登录远程主机执行命令时,提示如下错误: [192.168.1.135] 连接到远程服务器失败,错误消息如下: WinRM 客户端无法处理该请 ...

  8. Java-使用哈希码比较对象的值

    在一些特殊的情况下使用 package com.tj; import java.io.File; public class MyHash { public static void main(Strin ...

  9. 【01】webpack的安装过程截图

    [05](moyu:最好安装在C盘.默认的安装地址.) []全局安装 01,首先要安装Node.js, Node.js 自带了软件包管理器 npm. 02,Webpack 需要 Node.js v0. ...

  10. luogu3761 [TJOI2017]城市

    重点是求树的直径.半径. 参考这里 #include <iostream> #include <cstring> #include <cstdio> using n ...