zoukankan      html  css  js  c++  java
  • hdoj--5612--Baby Ming and Matrix games(dfs)

    

    Baby Ming and Matrix games

    Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)
    Total Submission(s): 1150    Accepted Submission(s): 298


    Problem Description
    These few days, Baby Ming is addicted to playing a matrix game.

    Given a nm matrix, the character in the matrix(i2,j2) (i,j=0,1,2...) are the numbers between 09. There are an arithmetic sign (‘+’, ‘-‘, ‘’, ‘/’) between every two adjacent numbers, other places in the matrix fill with ‘#’.

    The question is whether you can find an expressions from the matrix, in order to make the result of the expressions equal to the given integer sum. (Expressions are calculated according to the order from left to right)

    Get expressions by the following way: select a number as a starting point, and then selecting an adjacent digital X to make the expressions, and then, selecting the location of X for the next starting point. (The number in same place can’t be used twice.)
     

    Input
    In the first line contains a single positive integer T, indicating number of test case.

    In the second line there are two odd numbers n,m, and an integer sum(1018<sum<1018, divisor 0 is not legitimate, division rules see example)

    In the next n lines, each line input m characters, indicating the matrix. (The number of numbers in the matrix is less than 15)

    1T1000
     

    Output
    Print Possible if it is possible to find such an expressions.

    Print Impossible if it is impossible to find such an expressions.
     

    Sample Input
    3 3 3 24 1*1 +#* 2*8 1 1 1 1 3 3 3 1*0 /#* 2*6
     

    Sample Output
    Possible Possible Possible
    Hint
    The first sample:1+2*8=24 The third sample:1/2*6=3
     

    Source
     

    Recommend
    hujie   |   We have carefully selected several similar problems for you:  5639 5638 5637 5636 5635 

    传递的参数都是整数,如果遇到比较大的分母可能表达式的值为0,所以传递的b表示分母,遇到除法就把数乘到分母上,加法或者减法就乘以分母然后加减到分子上,最后判断的时候看是否等于sum*b
    #include<cstdio>
    #include<queue>
    #include<cstring>
    #include<iostream>
    #include<algorithm>
    using namespace std;
    int dx[4]={2,-2,0,0};
    int dy[4]={0,0,2,-2};
    char str[50][50];
    bool flag;
    int vis[50][50],n,m;
    __int64 sum;
    bool judge(int x,int y)
    {
    	return x>=0&&x<n&&y>=0&&y<m;
    }
    void dfs(int x,int y,__int64 a,__int64 b)
    {
    	if(flag) return ;
    	if(a==b*sum)
    	{
    		flag=true;
    		return;
    	}
    	for(int i=0;i<4;i++)
    	{
    		int xx=x+dx[i];
    		int yy=y+dy[i];
    		if(!judge(xx,yy)||vis[xx][yy]||str[xx][yy]<'0'||str[xx][yy]>'9'||str[xx][yy]=='#')
    		continue;
    		__int64 v=str[xx][yy]-'0';
    		int mx=(x+xx)>>1;
    		int my=(y+yy)>>1;
    		__int64 aa=a,bb=b;
    		if(str[mx][my]=='/'&&v==0) continue;
    		vis[xx][yy]=1;
    		if(str[mx][my]=='*'){aa*=v;}
    		else if(str[mx][my]=='/'){bb*=v;}
    		else if(str[mx][my]=='+') {aa+=bb*v;}
    		else {aa-=bb*v;}
    		dfs(xx,yy,aa,bb);
    		vis[xx][yy]=0;
    	}
    }
    int main()
    {
    	int t;
    	cin>>t;
    	while(t--)
    	{
    		scanf("%d%d",&n,&m);
    		scanf("%I64d",&sum);
    		flag=false;
    		memset(str,'',sizeof(str));
    		for(int i=0;i<n;i++)
    		scanf("%s",str[i]);
    		for(int i=0;i<n;i++)
    		{
    			for(int j=0;j<m;j++)
    			{
    				if(str[i][j]<='9'&&str[i][j]>='0')
    				{
    					memset(vis,0,sizeof(vis));
    					vis[i][j]=1;
    					__int64 val=str[i][j]-'0';
    					dfs(i,j,val,1);
    					if(flag) break;
    				}
    			}
    			if(flag) break;
    		}
    		printf(flag?"Possible
    ":"Impossible
    ");
    	}
    	return 0;
    }

  • 相关阅读:
    shell 脚本——第五节课 交互输入read与for语句
    shell 脚本——第四节课 Linux grep命令与正则表达
    shell 脚本——第三节课 编程原理
    shell脚本练习:一个添加用户test1到test10的脚本程序
    ARM设备树
    Ubuntu18.04 设置wifi热点
    二、卷积神经网络概念
    一、神经网络构建八股搭建
    边缘计算
    2.7 usb摄像头之usb摄像头描述符打印
  • 原文地址:https://www.cnblogs.com/playboy307/p/5273423.html
Copyright © 2011-2022 走看看