移动火柴棒判断等式是否成能成立

1: 从键盘读入一个式子(该式子肯定是一个不成立的等式)。 
2:判断,是否可以移动一根木棒可以使等式成立,则输出新的等式,否则输出No。

a.式子中的数只能是正数,运算符号只会出现加号和减号,并且有且仅有一个等号,不会出现括号、乘号或除号,也不会有++,--,+-或-+出现。 
b.式子中只能是整数,并且小于10
c.你不能移动=的木棒,所以加号、减号、等号是不会改变的。移动前后,木棒构成的数字必须严格与计算机器中显示的效果一致。 
d.从键盘读入的式子中的数不会以0开头,但允许修改后等式中的数以数字为开头。

#include <stdio.h>  

/* 定义操作符号,"+"或"-" */
#define SYMBOL_ERROR 0
#define SYMBOL_ADD   1
#define SYMBOL_MINUS 2  

/* 定义变化标识,取值原则:3个中随便取出n个相加不能等于其中一个数 */
#define FLAG_NO    0     /* 没有移动 */
#define FLAG_MINUS 10    /* 去一根火柴 */
#define FLAG_ADD   100   /* 增加一根火柴 */
#define FLAG_SELF  1000  /* 拿一根放自己身上另外的位置 */  

/* 定义合法移动 */
#define MOVE_TO_ANOTHER 110   /* 10 + 100 + 0,一个数拿一根,放到另一个数上 */
#define MOVE_TO_SELF    1000  /* 1000 + 0 + 0,自己拿一根放自己身上其他位置 */
#define MOVE_FROM_PLUS  100   /* 100 + 0 + 0,从加号上拿一根放一个数身上 */  

/* 定义火柴移动结构体 */
typedef struct matchstick
{
    int iFlag; /* 变化标识 */
    int iData; /* 火柴表示的数 */
}MATCH_STICK_S;  

/*
  获取一个数不动或移动一根火柴后得到的数(只列举3和6,其他数值类似)
  入参:指定的数(0-9)
  出差:MATCH_STICK_S结构数组
  返回值:移动一根火柴得到的数的个数
*/
int getDataAfterMoveStick(int iData, MATCH_STICK_S *pstStick)
{
    int iCount = 0;  

    switch(iData)
    {
        case 3:
        {
            pstStick[0].iFlag = FLAG_NO; pstStick[0].iData = 3;   /* 不动 */
            pstStick[1].iFlag = FLAG_ADD; pstStick[1].iData = 9;  /* 加一根 */
            pstStick[2].iFlag = FLAG_SELF; pstStick[2].iData = 2; /* 自己移动一根 */
            pstStick[3].iFlag = FLAG_SELF; pstStick[3].iData = 3;
            pstStick[4].iFlag = FLAG_SELF; pstStick[4].iData = 5;
            iCount = 5;
            break;
        }
        case 6:
        {
            pstStick[0].iFlag = FLAG_NO; pstStick[0].iData = 6;    /* 不动 */
            pstStick[1].iFlag = FLAG_ADD; pstStick[1].iData = 8;   /* 加一根 */
            pstStick[5].iFlag = FLAG_MINUS; pstStick[5].iData = 5; /* 减一根 */
            pstStick[2].iFlag = FLAG_SELF; pstStick[2].iData = 0;  /* 自己移动一根 */
            pstStick[3].iFlag = FLAG_SELF; pstStick[3].iData = 6;
            pstStick[4].iFlag = FLAG_SELF; pstStick[4].iData = 9;
            iCount = 6;
            break;
        }
        default:
        {
            break;
        }
    }  

    return iCount;
}  

/* 移动火柴
   返回值:
   SYMBOL_ERROR:非法移动
   SYMBOL_MINUS:从"+"上取一根加到某个数上
   SYMBOL_ADD:  不从"+"取火柴时,移动一根
 */
char checkStickMove(int iFlag1, int iFlag2, int iFlag3)
{
    char cSymbol = SYMBOL_ERROR;
    int iFlagSum = iFlag1 + iFlag2 + iFlag3;  

    if((MOVE_TO_ANOTHER == iFlagSum) || (MOVE_TO_SELF == iFlagSum))
    {
        cSymbol = SYMBOL_ADD;
    }
    else if(MOVE_FROM_PLUS == iFlagSum)
    {
        cSymbol = SYMBOL_MINUS;
    }  

    return cSymbol;
}  

/* 满足移动规则,并能使等式成立的,打印出来 */
void printResult(MATCH_STICK_S *pstStick1, MATCH_STICK_S *pstStick2, MATCH_STICK_S *pstStick3)
{
    int iFlag1 = pstStick1->iFlag;
    int iFlag2 = pstStick2->iFlag;
    int iFlag3 = pstStick3->iFlag;
    int iData1 = pstStick1->iData;
    int iData2 = pstStick2->iData;
    int iData3 = pstStick3->iData;  

    char cSymbol = checkStickMove(iFlag1, iFlag2, iFlag3);  

    if((SYMBOL_ADD == cSymbol) && (iData3 == iData1 + iData2))
    {
        printf("%d + %d = %d\n", iData1, iData2, iData3);
    }
    else if((SYMBOL_MINUS == cSymbol) && (iData3 == iData1 - iData2))
    {
        printf("%d - %d = %d\n", iData1, iData2, iData3);
    }  

    return;
}  

/* 处理火柴移动 */
void dealStickMove(int iData1, int iData2, int iData3)
{
    unsigned long ulLoop1, ulLoop2, ulLoop3;
    int iCount1, iCount2, iCount3;
    MATCH_STICK_S astStick1[10];
    MATCH_STICK_S astStick2[10];
    MATCH_STICK_S astStick3[10];  

    iCount1 = getDataAfterMoveStick(iData1, astStick1);
    iCount2 = getDataAfterMoveStick(iData2, astStick2);
    iCount3 = getDataAfterMoveStick(iData3, astStick3);  

    for(ulLoop1 = 0; ulLoop1 < iCount1; ulLoop1++)
    {
        for(ulLoop2 = 0; ulLoop2 < iCount2; ulLoop2++)
        {
            for(ulLoop3 = 0; ulLoop3 < iCount3; ulLoop3++)
            {
                printResult(&astStick1[ulLoop1], &astStick2[ulLoop2], &astStick3[ulLoop3]);
            }
        }
    }  

    return;
}  

int main()
{
    dealStickMove(3, 6, 3);  

    return 0;
}  
时间: 2024-10-06 15:04:25

移动火柴棒判断等式是否成能成立的相关文章

洛谷-火柴棒等式-NOIP2008提高组复赛

题目描述 Description 给你n根火柴棍,你可以拼出多少个形如“A+B=C”的等式?等式中的A.B.C是用火柴棍拼出的整数(若该数非零,则最高位不能是0).用火柴棍拼数字0-9的拼法如图所示: 注意: 1. 加号与等号各自需要两根火柴棍 2. 如果A≠B,则A+B=C与B+A=C视为不同的等式(A.B.C>=0) 3. n根火柴棍必须全部用上 输入输出格式 Input/output 输入格式: 输入文件matches.in共一行,又一个整数n(n<=24). 输出格式: 输出文件mat

noip2008 火柴棒等式

P1149 火柴棒等式 1.9K通过 3.7K提交 题目提供者该用户不存在 标签搜索/枚举模拟2008NOIp提高组 难度普及- 提交该题 讨论 题解 记录 题目描述 给你n根火柴棍,你可以拼出多少个形如“A+B=C”的等式?等式中的A.B.C是用火柴棍拼出的整数(若该数非零,则最高位不能是0).用火柴棍拼数字0-9的拼法如图所示: 注意: 加号与等号各自需要两根火柴棍 如果A≠B,则A+B=C与B+A=C视为不同的等式(A.B.C>=0) n根火柴棍必须全部用上 输入输出格式 输入格式: 输入

P1149 火柴棒等式

P1149 火柴棒等式 4.6K通过 8.6K提交 题目提供者该用户不存在 标签 NOIp提高组 2008 云端 难度 普及- 时空限制 1s / 128MB 题目描述 给你n根火柴棍,你可以拼出多少个形如"A+B=C"的等式?等式中的A.B.C是用火柴棍拼出的整数(若该数非零,则最高位不能是0) .用火柴棍拼数字0-9的拼法如图所示: 注意: 加号与等号各自需要两根火柴棍 如果A≠B,则A+B=C与B+A=C视为不同的等式(A.B.C>=0) n根火柴棍必须全部用上 输入输出格

P1016 [NOIP2008T2]火柴棒等式 - Smart Online Judge

不罗嗦,简单暴力枚举,由于输入规模比较小,希望能有更好的算法. 题目ID:1016 题目名称:[NOIP2008T2]火柴棒等式 有效耗时:932 ms 空间消耗:1872 KB 程序代码: 1 import java.util.Scanner; 2 3 4 public class Main { 5 static int[] a={6,2,5,5,4,5,6,3,7,6,2,2}; 6 7 static int getsum(int n){ 8 int sum=0; 9 for(int i=0

1168 火柴棒等式

1168 火柴棒等式 链接:http://codevs.cn/problem/1168/ 2008年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目描述 Description 给你n根火柴棍,你可以拼出多少个形如"A+B=C"的等式?等式中的A.B.C是用火柴棍拼出的整数(若该数非零,则最高位不能是0).用火柴棍拼数字0-9的拼法如图所示: 注意: 1. 加号与等号各自需要两根火柴棍 2. 如果A≠B,则A+B=C与B+A=C视为不同的等式(A.B.C

火柴棒等式

这题难道不高,关键在于思路,其实\(+\),\(=\)个占\(4\)个火柴棒,而他们是必须存在的,所以对火柴棒数\(-4\)就简单了,在枚举上,我们可以枚举\(2\)个数,第三个数就是a\(+b\)啦!根据只有\(20\)根火柴棒(删掉了\(=\)和\(+\)),我们能知道枚举数不会超过\(1111\),有些童鞋只枚举到了1000,难道是我错了??? 注意全部火柴必须用上,该数非零,则最高位不能是\(0\) Code #include <iostream> using namespace st

火柴棒的问题c语言(枚举)

规则: 1.a + b = c; 2.用完火柴棒: 代码如下: 1 #include <stdio.h> 2 int fun(int x); 3 4 int main() 5 { 6 int a,b,c,sum=0,m; 7 scanf("%d",&m); //输入火柴的根数 8 for(a=0;a<=1111;a++) 9 { 10 for(b=0;b<=1111;b++) 11 { 12 c=a+b; 13 if(fun(a) + fun(b) +f

sql事务,在sql2000里判断执行是否成功用@@ERROR 判断

原文:sql事务,在sql2000里判断执行是否成功用@@ERROR 判断 贴个sql事务,在sql2000里判断执行是否成功用@@ERROR 判断 这个东西多少还是有点问题,sql2005了可以用try..catch了,不管那块错都能捕捉,然后在回滚,很方便,贴出来晾晾 BEGIN TRANSACTION; BEGIN TRY  --try 执行sql       SELECT 1/0; END TRY BEGIN CATCH  --cache抓错     SELECT         ERR

Luogu p1149 / Vijos p1496 火柴棒等式

给你n根火柴棍,你可以拼出多少个形如"A+B=C"的等式?等式中的A.B.C是用火柴棍拼出的整数(若该数非零,则最高位不能是0).用火柴棍拼数字0-9的拼法如图所示: 注意: 加号与等号各自需要两根火柴棍 如果A≠B,则A+B=C与B+A=C视为不同的等式(A.B.C>=0) n根火柴棍必须全部用上 输入输出格式 输入格式: 输入文件matches.in共一行,又一个整数n(n<=24). 输出格式: 输出文件matches.out共一行,表示能拼成的不同等式的数目. 输入