Luogu P2049 魔术棋子

Luogu P2049 魔术棋子

  • 题目描述
  • 输入格式
  • 输出格式
  • 输入输出样例
    • 输入
    • 输出
  • 解析
  • 代码

题目描述

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

3    4    4
5    6    6

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

输入格式

第一行为三个数,分别为 M , N , K ( 1 ≤ M , N , K ≤ 100 ) M,N,K (1 \le M,N,K \le 100) M,N,K(1M,N,K100)以下M行,每行N个数,分别为此方阵中的数。

输出格式

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

输入输出样例

输入

2 3 5
3 4 4
5 6 6

输出

3
0 2 3

解析

一道很显然的dfs题。记得记忆化!

代码

#include
using namespace std;
int m, n, k;
int map[1001][1001];
bool buc[101];
bool book[1001][1001][1001];
bool in(int x, int y)
{
	return x > 0 && x <= m && y > 0 && y <= n;
}
void dfs(int x, int y, int t)
{
	if(book[x][y][t] || !in(x, y))return;
	book[x][y][t] = 1;
	t *= map[x][y];
	t %= k;
	if(x == m && y == n)
	{
		buc[t] = true;
		return;
	}
	dfs(x + 1, y, t);
	dfs(x, y + 1, t);
}
int main()
{
	cin >> m >> n >> k;
	for(int i = 1; i <= m; i++)
	{
		for(int j = 1; j <= n; j++)
		{
			cin >> map[i][j];
		}
	}
	dfs(1, 1, 1);
	int ans = 0;
	for(int i = 0;i < k;i++){
		if(buc[i])ans++;
	}
	cout << ans << endl;
	for(int i = 0;i < k;i++){
		if(buc[i])cout << i << ' ';
	}
	return 0;
}

你可能感兴趣的:(C++)