uva 10344解题报告

Input: standard input

Output: standard output

Time Limit: 1 second

Memory Limit: 32 MB

Your task is to write a program that can decide whether you can find an arithmetic expression consisting of five given numbers (1<=i<=5) that will yield the value 23.
For this problem we will only consider arithmetic expressions of the following from:

 
where : {1,2,3,4,5} -> {1,2,3,4,5} is a bijective function
and  {+,-,*} (1<=i<=4)

Input

The Input consists of 5-Tupels of positive Integers, each between 1 and 50.
Input is terminated by a line containing five zero's. This line should not be processed.

Output

For each 5-Tupel print "Possible" (without quotes) if their exists an arithmetic expression_r(as described above) that yields 23. Otherwise print "Impossible".

Sample Input

1 1 1 1 1
1 2 3 4 5
2 3 5 7 11
0 0 0 0 0

Sample Output

Impossible
Possible
Possible

Thomas Strohmann

10344 - 23 out of 5

 

 

这题一开始就把题意给理解错了。。想的太复杂了。。导致原来想直接用暴力就强行把这题A了。。可是题目理解错了写不下去搜了些解题报告才知道要做什么。(这里引用力哥的题意理解:题意:给出5个数,只用+-*这三种运算符从前到后运算,能不能使其值为23.

就是对给出的数全排列,然后深搜。)不过我这里用没有全排序直接就深搜了。
#include<stdio.h>
int a[5],flag;
bool vis[5];
void dfs(int cur,int res)
{
  if(cur==5&&res==23)//结束的边界;
  {
    flag=1;
    return;
  }
  else for(int i=0;i<5;i++)
  {
    if(!vis[i])
    {
      vis[i]=true;
      dfs(cur+1,res+a[i]);
      dfs(cur+1,res-a[i]);
      dfs(cur+1,res*a[i]);
      vis[i]=false;//千万别漏了哦;
    }
  }
}
int main()
{
  while(scanf("%d %d %d %d %d",&a[0],&a[1],&a[2],&a[3],&a[4])!=EOF)
  {
    if(a[0]==0&&a[1]==0&&a[2]==0&&a[3]==0&&a[4]==0)
      break;
    flag=0;
    for(int i=0;i<5;i++)
    {
      for(int j=0;j<5;j++)
        vis[j]=false;
      vis[i]=true;
      dfs(1,a[i]);
    }
    if(flag)printf("Possible\n");
    else printf("Impossible\n");
  }
  return 0;
}

 

#include<stdio.h>
int a[5],flag;
bool vis[5];
void dfs(int cur,int res)
{
 if(cur==5&&res==23)//结束的边界;
 {
  flag=1;
  return;
 }
 else for(int i=0;i<5;i++)
 {
  if(!vis[i])
  {
   vis[i]=true;
   dfs(cur+1,res+a[i]);
   dfs(cur+1,res-a[i]);
   dfs(cur+1,res*a[i]);
   vis[i]=false;//千万别漏了哦;
  }
 }
}
int main()
{
 while(scanf("%d %d %d %d %d",&a[0],&a[1],&a[2],&a[3],&a[4])!=EOF)
 {
  if(a[0]==0&&a[1]==0&&a[2]==0&&a[3]==0&&a[4]==0)
   break;
  flag=0;
  for(int i=0;i<5;i++)
  {
   for(int j=0;j<5;j++)
    vis[j]=false;
   vis[i]=true;
   dfs(1,a[i]);//这里挺纠结的到底是0还是1呢?
  }
  if(flag)printf("Possible\n");
  else printf("Impossible\n");
 }
 return 0;
}

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值