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. Python基础篇 -- 小数据池和再谈编码

    小数据池 1. id() 通过id()可以查看到一个变量表示的值在内存中的地址 s = "Agoni" print(id(s)) # 2410961093272 2. is 和 = ...

  2. shell脚本,提取ip地址和子网掩码,和查外网ip地址信息。

        #提取IP地址和子网掩码 [root@localhost ~]# ifconfig eth0|grep 'inet addr'|awk -F'[ :]+' '{print $4"/& ...

  3. passive event 解决方法

    为了让页面滚动的效果如丝般顺滑,从 chrome56 开始,在 window.document 和 body 上注册的 touchstart 和 touchmove 事件处理函数,会默认为是 pass ...

  4. HashMap允许将null用作键 也允许将null作为值

    HashMap不能保证元素的顺序,HashMap能够将键设为null,也可以将值设为null. 与之对应的是Hashtable,(注意大小写:不是HashTable),Hashtable不能将键和值设 ...

  5. 【动态规划】luoguP1941 飞扬的小鸟

    细节总是打挂选手:) 题目描述 Flappy Bird是一款风靡一时的休闲手机游戏.玩家需要不断控制点击手机屏幕的频率来调节小鸟的飞行高度,让小鸟顺利通过画面右方的管道缝隙.如果小鸟一不小心撞到了水管 ...

  6. tkinter学习-滚动条

    阅读目录 Listbox 以列表的形式显示 Scrollbar 滚动条 Scale 更滚动条很相似,但更精准 Listbox:  说明:列表框控件,在Listbox窗口小部件是用来显示一个字符串列表给 ...

  7. 【Linux】用户与权限

    追加用户组 groupadd 用户组名 追加新用户 useradd -d 指定用户目录 -s 指定用户使用shell -g 指定用户组 -p 指定用户密码 用户名 更改用户  添加用户到其他组 use ...

  8. 使用 HTML5 Geolocation 构建基于地理位置的 Web 应用学习网站分享

    HTML5 中的新功能 HTML5 是最新一代的 HTML 规范,是 W3C 与 WHATWG 合作的结果,目前仍外于开发中.自从上一代 HTML4,Web 世界已经发生了巨大的变化,HTML5 的到 ...

  9. jsDate()

    var myTime=new Date();//myTime的数据类型为(typeof) object //下面得到的都为number 类型 getFullYear();年 四位数字返回年份. get ...

  10. Processed foods make us fatter easily

    From Business Insider Here's an experiment: sit alone in a hospital room for two weeks and eat nothi ...