HDU 5612 Baby Ming and Matrix games(DFS)

题目链接

题解:题意为给出一个N*M的矩阵,然后(i2,j2) (i,j=0,1,2...)的点处是数字,两个数字之间是符号,其他位置是‘#’号。
但不知道是理解的问题还是题目描述的问题,数据中还有类似1#1这种数据存在,因此WA了4次,加上了一句代码后,马上AC了,该行代码在下文以斜粗体标出。
此外,因为里面有除法,会有一定误差,所以用这句来判断:fabs(tar-nnum)<=1e-8,而不是tar==nnum。
 
#include <cstdio>
#include <iostream>
#include <string>
#include <sstream>
#include <cstring>
#include <stack>
#include <queue>
#include <algorithm>
#include <cmath>
#include <map>
#define ms(a) memset(a,0,sizeof(a))
using namespace std;
#define LOCAL
char mp[120][120];
int n,m;
double tar;
bool flag;
int dir[4][2]= {{0,2},{0,-2},{2,0},{-2,0}};
double cal(double n,double m,char c)
{
    if(c=='+')return n+m;
    if(c=='-')return n-m;
    if(c=='*')return n*m;
    if(c=='/')return n/m;
    return 0;
}
void dfs(int x,int y,double num)
{
    if(flag)return;
    for(int i=0; i<4; i++)
    {
        int nx=x+dir[i][0],ny=y+dir[i][1];
        if(mp[nx][ny]!='#'&&(nx>=0&&nx<n&&ny>=0&&ny<m))
        {
            char ch=mp[nx][ny];
            mp[nx][ny]='#';
            if(mp[x+dir[i][0]/2][y+dir[i][1]/2]=='#')return;
            double nnum=cal(num,ch-'0',mp[x+dir[i][0]/2][y+dir[i][1]/2]);
            if(fabs(tar-nnum)<=1e-8)
            {
                flag=true;
                return;
            }
            dfs(nx,ny,nnum);
            mp[nx][ny]=ch;
        }
    }
    return;
}
int main()
{
#ifdef LOCAL
    freopen("in.txt", "r", stdin);
#endif // LOCAL
    //Start
    int N;
    cin>>N;
    while(N--)
    {
        cin>>n>>m>>tar;
        ms(mp);
        flag=false;
        for(int i=0; i<n; i++)
        {
            cin>>mp[i];
        }
        for(int i=0; i<n; i++)
        {
            for(int j=0; j<m; j++)
            {
                if(isdigit(mp[i][j]))
                {
                    char sav=mp[i][j];
                    if((sav-'0')==tar)
                    {
                        flag=true;
                        break;
                    }
                    mp[i][j]='#';
                    dfs(i,j,sav-'0');
                    mp[i][j]=sav;
                }
                if(flag)break;
            }
            if(flag)break;
        }
        if(flag)printf("Possible
");
        else printf("Impossible
");
    }
    return 0;
}
原文地址:https://www.cnblogs.com/gpsx/p/5166106.html