魔术棋子(记忆化搜索)

#include<iostream>
using namespace std;
int n,m,k,ans;
int map[110][110];
int vis[110][110][110];
int main()
{
    cin>>n>>m>>k;
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=m;j++)
        {
            cin>>map[i][j];
        }
    }
    vis[1][1][map[1][1]%k]=1;
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=m;j++)
        {
            for(int x=0;x<k;x++)
            {
                if(vis[i-1][j][x]!=0)
                {
                    vis[i][j][x*map[i][j]%k]=1;
                }
                if(vis[i][j-1][x]!=0)
                {
                    vis[i][j][x*map[i][j]%k]=1;
                }
            }
        }
    }
    for(int i=0;i<k;i++)
    {
        if(vis[n][m][i]!=0)
        {
            ans++;
        }
    }
    cout<<ans<<endl;
    for(int i=0;i<k;i++)
    {
        if(vis[n][m][i]!=0)
        {
            cout<<i<<" ";
        }
    }
    return 0;
}
原文地址:https://www.cnblogs.com/Chri-K/p/13886253.html