HDU 5612 Baby Ming and Matrix games

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HDU 5612 Baby Ming and Matrix games相关的知识,希望对你有一定的参考价值。

暴力搜索,据说精度卡的紧。。。但我是double过了的。

#include<cstdio>
#include<cstring>
#include<vector>
#include<cmath>
#include<queue>
#include<list>
#include<algorithm>
using namespace std;

const double eps=1e-8;
int dir[4][2],t[4][2];
double a[100][100];
bool flag[100][100];
char s[100][100];
int n,m;
double sum;
bool ans;
double path[1000];

void init()
{
    dir[0][0]=2; dir[0][1]=0;
    dir[1][0]=-2; dir[1][1]=0;
    dir[2][0]=0; dir[2][1]=2;
    dir[3][0]=0; dir[3][1]=-2;

    t[0][0]=1; t[0][1]=0;
    t[1][0]=-1; t[1][1]=0;
    t[2][0]=0; t[2][1]=1;
    t[3][0]=0; t[3][1]=-1;

    for(int i=0;i<n;i++)
        for(int j=0;j<m;j++)
            a[i][j]=-1.0;

    for(int i=0; i<n; i++)
        for(int j=0; j<m; j++)
            if(s[i][j]>=0&&s[i][j]<=9)
                a[i][j]=1.0*(s[i][j]-0);

    memset(flag,0,sizeof flag);
}

void dfs(double nowNum,int nowx,int nowy,int tot)
{
    if(fabs(nowNum-sum)<eps)
    {
        ans=1;
        return;
    }

        for(int i=0; i<4; i++)
        {
            double newNum;
            int newX,newY;
            newX=nowx+dir[i][0];
            newY=nowy+dir[i][1];
            if(newX>=0&&newX<n)
            {
                if(newY>=0&&newY<m)
                {
                    if(flag[newX][newY]==0)
                    {
                        flag[newX][newY]=1;
                        if(s[nowx+t[i][0]][nowy+t[i][1]]==+)
                        {
                            newNum=nowNum+a[newX][newY];
                            
                            dfs(newNum,newX,newY,tot+1);
                            if(ans) return;

                        }
                        else if(s[nowx+t[i][0]][nowy+t[i][1]]==-)
                        {
                            newNum=nowNum-a[newX][newY];
                            
                            dfs(newNum,newX,newY,tot+1);
                            if(ans) return;

                        }
                        else if(s[nowx+t[i][0]][nowy+t[i][1]]==*)
                        {
                            newNum=nowNum*a[newX][newY];
                            
                            dfs(newNum,newX,newY,tot+1);
                            if(ans) return;

                        }
                        else if(s[nowx+t[i][0]][nowy+t[i][1]]==/)
                        {
                            if(fabs(a[newX][newY]-0.0)<eps) {
                                    flag[newX][newY]=0;continue;
                            }
                            newNum=nowNum/a[newX][newY];
                            
                            dfs(newNum,newX,newY,tot+1);
                            if(ans) return;

                        }
                        flag[newX][newY]=0;
                    }
                }
            }
        }
}

int main()
{
    int T;
    scanf("%d",&T);
    while(T--)
    {
        scanf("%d%d%lf",&n,&m,&sum);

        for(int i=0; i<n; i++) scanf("%s",s[i]);
        init();
        
        ans=0;
        for(int i=0; i<n; i++)
            for(int j=0; j<m; j++)
                if(a[i][j]>=0)
                {
                    memset(flag,0,sizeof flag);
                    flag[i][j]=1;
                    dfs(a[i][j],i,j,1);
                    if(ans) break;
                }

        if(ans) printf("Possible\n");
        else printf("Impossible\n");
    }
    return 0;
}

 

以上是关于HDU 5612 Baby Ming and Matrix games的主要内容,如果未能解决你的问题,请参考以下文章

hdu5612 Baby Ming and Matrix games (dfs加暴力)

HDU 5610 Baby Ming and Weight lifting 暴力

HDU 5611 Baby Ming and phone number

BestCoder Round #69 (div.2) Baby Ming and Weight lifting(hdu 5610)

Baby Ming and Matrix games(dfs计算表达式)

hdu 5616