zoukankan      html  css  js  c++  java
  • hdu 5612 Baby Ming and Matrix games

    Baby Ming and Matrix games

    题意: 给一个矩形,两个0~9的数字之间隔一个数学运算符(‘+’,’-‘,’*’,’/’),其中’/’表示分数除,再给一个目标的值,问是否存在从一个数字出发,以数字之间的运算符为运算,得到这个目标值;(每个数字只能用一次,其实说白了就是dfs..);可以则输出(Impossible),否则输出(Possible);

    思路:坑点就是里面本来全是整数,但是一个除法运算却是分数形式,开始使用了很保险的分数保存,来避免误差的。但是无情WA了很多次。。突然发现写成了(ImPossible)…醉了,然后以为现在肯定要A了,但是还是WA了。。。(有兴趣的帮我找找bug哈!真心感谢)之后重写了一个double类型的,无奈啊(太水了),下面是A和WA两份代码

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<string.h>
    #include<algorithm>
    #include<map>
    #include<queue>
    #include<vector>
    #include<cmath>
    #include<stdlib.h>
    #include<time.h>
    using namespace std;
    #define rep(i,n) for(int i = 1;i <= n;i++)
    #define MS0(a) memset(a,0,sizeof(a))
    #define esp 1e-6
    int n,m,vis[35][35],f;
    double sum;
    char s[35][35];
    int dir[2][4] = {{0,1,0,-1},{1,0,-1,0}};
    double cal(double val,double v,char op)
    {
        if(op == '+') return val + v;
        else if(op == '-') return val - v;
        else if(op == '*') return val * v;
        return val/v;
    }
    void dfs(int i,int j,double val)
    {
        if(fabs(val - sum) < esp) f = 0;
        for(int k = 0;k < 4 && f;k++){
            int x = i + 2*dir[0][k] , y = j + 2*dir[1][k];
            char op = s[i + dir[0][k]][j + dir[1][k]];
            if(x < 1 || x > n || y < 1 || y > m || vis[x][y]) continue;
            int v = s[x][y] - '0';
            if(op == '/' && v == 0) continue;
            vis[x][y] = 1;
            dfs(x,y,cal(val,v,op));
            vis[x][y] = 0;
        }
    }
    int main()
    {
        int T,i,j;
        cin>>T;
        while(T--){
            f= 1;MS0(vis);
            scanf("%d%d%lf",&n,&m,&sum);
            rep(i,n) scanf("%s",s[i] + 1);
            for(i = 1;i <= n && f;i += 2)
            for(j = 1;j <= m && f;j += 2){
                vis[i][j] = 1;
                dfs(i,j,s[i][j] - '0');
                vis[i][j] = 0;
            }
            puts(f?"Impossible":"Possible");
        }
        return 0;
    }
    Accpeted code
    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<string.h>
    #include<algorithm>
    #include<map>
    #include<queue>
    #include<vector>
    #include<cmath>
    #include<stdlib.h>
    #include<time.h>
    using namespace std;
    typedef long long ll;
    #define MS0(a) memset(a,0,sizeof(a))
    ll cal(ll a,ll b,char op)
    {
        if(op == '+') return a + b;
        if(op =='-') return a - b;
        if(op == '*') return a * b;
    }
    int dir[2][4] = {{0,1,0,-1},{1,0,-1,0}};
    char s[100][100];
    ll sum,f;
    int n,m,vis[50][50];
    void dfs(int i,int j,ll ele,ll den)
    {
        if(ele%den == 0 && ele / den == sum) f = 0;
        ll e = ele, d = den;
        for(int k = 0;k < 4 && f;k++){
            //system("pause");
            int x = i + 2*dir[0][k],y = j + 2*dir[1][k];
            char op = s[i+dir[0][k]][j+dir[1][k]];
            if(x < 1 || x > n || y < 1|| y > m||vis[x][y]) continue;
            ele = e,den = d;
            int val = (s[x][y]-'0');
            if(op =='/'){
                if(val == 0) continue;
                if(ele % val) den *= val;
                else ele /= val;
            }
            else ele = cal(ele,val,op);
            if(ele % den == 0) ele /= den,den = 1;
            vis[x][y] = 1;
            dfs(x,y,ele,den);
            vis[x][y] = 0;
        }
    }
    int main()
    {
        int T,i,j;
        cin>>T;
        while(T--){
            MS0(vis);
            scanf("%d%d%I64d",&n,&m,&sum);
            for(i = 1;i <= n;i++)
                scanf("%s",s[i] + 1);
            f = 1;
            for(i = 1;i <= n && f;i += 2)
                for(j = 1;j <= m && f;j += 2){
                    vis[i][j] = 1;
                    dfs(i,j,(ll)(s[i][j] - '0'),1);
                    vis[i][j] = 0;
            }
            puts(f?"Impossible":"Possible");
        }
        return 0;
    }
    WA Code
  • 相关阅读:
    OpenCV笔记——cvFloodFill漫水填充算法
    C# 总结 随笔
    MYSQL存储过程 随笔
    MYSQL总结 随笔
    xPath 总结 随笔
    Javascript 总结 随笔
    linux中top查看cpu使用率超过100%
    页面优化小记1
    基于数据库的多语言解决方案
    基于消息队列的日志组件
  • 原文地址:https://www.cnblogs.com/hxer/p/5185140.html
Copyright © 2011-2022 走看看