Hdu 5016 Baby Ming and Matrix games【dfs】

36 篇文章 0 订阅

Baby Ming and Matrix games

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

Description

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

Given a $n*m$ matrix, the character in the matrix$(i*2, j*2) \ (i, j = 0, 1, 2 ...)$ are the numbers between $0-9$. 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($-10^{18} < sum < 10^{18}$, 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$) 

$1 \leq T \leq 1000$
 

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 
 

题意:

一幅图,给出规模和目标值,问能否通过某些数字和符号的组合得到目标的值

.

题解:

直接暴力搜索+回溯


也许今生都忘不了这道题!!!

错了不知道几十遍,从三点多调到现在,终于敢写博客了.....

本来是一个简单的dfs加上回溯,结果由于自己的一些小疏忽,一直在细节上wa1...最终还是比较完善的解决掉了....


另外精度的控制,真的不知道要怎么办了,到底多少才是适合的???


#include<stdio.h>
#include<string.h>
#include<math.h>
int n,m,kase,vis[55][55],dx[4]={0,0,-2,2},dy[4]={-2,2,0,0};
char map[55][55];
double s;
double num(double x,double y,char ch)
{
	switch (ch)
	{
		case '+':return x+y;
		case '-':return x-y;
		case '*':return x*y;
		case '/':return x/y;
	}
}
void dfs(int x,int y,double sum)
{
	if(kase)//找到结果了
	{
		return;
	}
	if(fabs(sum-s)<1e-6)//相等了
	{
		kase=1;
		return;
	}
	for(int i=0;i<4;++i)
	{
		int tx=x+dx[i],ty=y+dy[i];
		if(tx<0||tx>=n||ty<0||ty>=m)//越界
		{
			continue;
		}
		int tp=map[tx][ty]-'0';
		char op=map[x+dx[i]/2][y+dy[i]/2];
		if(tp==0&&op=='/')//除零错误
		{
			continue;
		}
		if(!vis[tx][ty])
		{
			vis[tx][ty]=1;
			dfs(tx,ty,num(sum,tp,op));
			vis[tx][ty]=0;//回溯
		}
	}
}
void slove()
{
	kase=0;
	memset(vis,0,sizeof(vis));
	for(int i=0;i<n;i+=2)
	{
		for(int j=0;j<m;j+=2)
		{
		    <span style="white-space:pre">	</span>vis[i][j]=1;
			dfs(i,j,map[i][j]-'0');
			if(kase)
			{
				printf("Possible\n");//符合要求了
				return;
			}
			vis[i][j]=0;//取消标记
		}
	}
	printf("Impossible\n");
}
int main()
{
	int t;
	//freopen("shuju.txt","r",stdin);
	scanf("%d",&t);
	while(t--)
	{
		scanf("%d%d%lf",&n,&m,&s);
		for(int i=0;i<n;++i)
		{
			scanf("%s",map[i]);
		}
		slove();
	}
	return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值