ZOJ1004_Anagrams by Stack

ZOJ1004 Anagrams by Stack

地址: http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=1004

这题我的想法有点不太一样,如果直接用传说中的回溯,入栈出栈应该代码会很短,但是我用的思路比较不太一样。

我先从源字符串的最后开始 找 目标字符串的 第一位,然后利用找到字符在源字符串的当前位置和之前已有的 "i" 个数来确定 这次i的个数 和 这次结果是否合理。

找到第一个后,递归找第二个。具体的思路可以看代码。

代码比较长,思路也比较烦,之后会去网上看些别人的思路。

zoj1004_m1
  1 /************************************************************************
  2  Function:        ZOJ1004: http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=1004
  3  History :        Create:2012年11月22日23:03:01 (Actually, it is, strictly, a completion time
  4  Owner:            Yang HaiTao( Dennis Young)
  5  Reflection:    There is a much easier way to make it(_2) using 回溯.
  6                 Maybe I don
  7 ************************************************************************/
  8 #include <stdio.h>
  9 #include <string.h>
 10 #include <math.h>
 11 
 12 /*Bound*/
 13 #define kIOArraySize        51
 14 #define kWordsArraySize    50
 15 /*    state    */
 16 #define kStateCheckTrue        1
 17 #define kStateCheckFalse        0
 18 #define kStateNotFound        0
 19 #define kStateHasFound        1
 20 
 21 int searchTarstrFromSrcstr(char *srcStr, char *tarStr, int inOutSum);
 22 void outputTLArray(int TLArray[kIOArraySize]);
 23 void resetTLArray(int TLArray[kIOArraySize]);
 24 void resetTLArrayByStep(int TLArray[kIOArraySize]);
 25 
 26 /************************************************************************
 27 *                        Global Variable                                    *                                                         
 28 ************************************************************************/
 29 /* 0: exit    1: in        2: out
 30 index0: currentIndex         1-1000->in,out to print.
 31 */
 32 int printTempLineArray[kIOArraySize] = {0};
 33 char charTable[3] = {'p', 'i', 'o'};
 34 
 35 int main()
 36 {
 37     char sourceWords[kWordsArraySize], targetWords[kWordsArraySize];
 38     int state;
 39 
 40     while (gets(sourceWords) != NULL && gets(targetWords) != NULL)
 41     {
 42         printf("[\n");
 43         state = searchTarstrFromSrcstr(sourceWords, targetWords, 0);
 44         printf("]\n");
 45     }
 46 
 47     return 0;
 48 }
 49 
 50 int searchTarstrFromSrcstr(char *srcStr, char *tarStr, int inOutSum)
 51 {
 52     int srcStrLength = 0;
 53     int tarStrLength = 0;
 54     int foundFlag = kStateNotFound;
 55     int i = 0;
 56     int k = 0;
 57     int howToNameThisNum = 0;
 58     char newSrcStr[kWordsArraySize] = {0};
 59 
 60     srcStrLength = strlen(srcStr);
 61     tarStrLength = strlen(tarStr);
 62 
 63     /*    error return and end return*/
 64     /* End of the String*/
 65     if (0 == srcStrLength && 0 == tarStrLength)
 66     {
 67         outputTLArray(printTempLineArray);
 68         return kStateCheckTrue;
 69     }
 70     else if (srcStrLength != tarStrLength)
 71     {
 72         /* it can not do this with different string length*/
 73         resetTLArray(printTempLineArray);
 74         return kStateCheckFalse;
 75     }
 76 
 77     /*search the 1st char of target string from last char of the source string*/
 78     for (i=srcStrLength - 1; i>=0; i--)
 79     {
 80         if (srcStr[i] == tarStr[0])
 81         {
 82             foundFlag = kStateHasFound;
 83 
 84             /* howToNameThisNum is a temp number which is important to the next step*/
 85             howToNameThisNum = i + 1 - inOutSum;
 86             if (howToNameThisNum < 0)
 87             {
 88                 /*NOTE:  <0 means, you need to out more than one char to get the char that you want,
 89                     but the unnecessary char will make your target word Wrong.*/
 90                 /* !!!!Important one!!!!!   you need to reset last step when the function will return false*/
 91                 resetTLArrayByStep(printTempLineArray);
 92                 return kStateCheckFalse;
 93             }
 94             else
 95             {
 96                 /*insert "i" into the print Array*/
 97                 for (k = 1; k<= howToNameThisNum; k++)
 98                 {
 99                     printTempLineArray[(printTempLineArray[0]+k)] = 1;
100                 }
101                 /*inset "o" into the print Array*/
102                 printTempLineArray[0] = 
103                     printTempLineArray[0] + howToNameThisNum+ 1;
104                 /*set the first flag number*/
105                 printTempLineArray[printTempLineArray[0]] = 2;
106                 
107                 /*creat new source string
108                 The way like this:            source:aabcd    target:b
109                     1.new=""    ->    2.new="aa"    ->     3.new="aacd"    */
110                 strcpy(newSrcStr,"");
111                 strncpy(newSrcStr, srcStr, i+1-1);
112                 newSrcStr[i] = '\0';
113                 strcat(newSrcStr, srcStr+i+1);
114 
115                 /*find the next char of the target string from the new source string*/
116                 if (kStateCheckFalse == searchTarstrFromSrcstr
117                     (newSrcStr, tarStr+1, inOutSum + howToNameThisNum - 1))
118                 {
119                     /*resetTLArray(printTempLineArray);
120                     //这里不用resetTLArray只需设置notfound*/
121                     /* you need set the foundFlag back to NotFound, begin the child function return false.*/
122                     foundFlag = kStateNotFound;
123                 }
124                 else
125                 {
126                     /*    This is IMPORTENT!!!!!!!*/
127                     resetTLArrayByStep(printTempLineArray);
128                 }
129             }
130         }
131     }
132 
133     if (kStateNotFound == foundFlag)
134     {
135         resetTLArray(printTempLineArray);
136         return kStateCheckFalse;
137     }
138     else
139         return kStateCheckTrue;
140 }
141 
142 void outputTLArray(int TLArray[kIOArraySize])
143 {
144     int i = 0;
145 
146     for (i = 1; i <= TLArray[0]; i++)
147     {
148         printf("%c ",charTable[TLArray[i]]);
149     }
150     printf("\n");
151 }
152 
153 void resetTLArray(int TLArray[kIOArraySize])
154 {
155     int i = 0;
156     for (i = 1; i <= TLArray[0]; i++)
157     {
158         TLArray[i] = 0;
159     }
160     TLArray[0] = 0;
161 }
162 
163 void resetTLArrayByStep(int TLArray[kIOArraySize])
164 {
165     int i = 0;
166     i = TLArray[0];
167     do 
168     {
169         TLArray[i] = 0;
170         i--;
171         TLArray[0]--;
172     } while(i>0 && TLArray[i] != 2);
173 }

转载于:https://www.cnblogs.com/guangTouT/archive/2012/11/25/2787202.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
毕设新项目-基于Java开发的智慧养老院信息管理系统源码+数据库(含vue前端源码).zip 【备注】 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,放心下载使用!有问题及时沟通交流。 2、适用人群:计算机相关专业(如计科、信息安全、数据科学与大数据技术、人工智能、通信、物联网、自动化、电子信息等)在校学生、专业老师或者企业员工下载使用。 3、用途:项目具有较高的学习借鉴价值,不仅适用于小白学习入门进阶。也可作为毕设项目、课程设计、大作业、初期项目立项演示等。 4、如果基础还行,或热爱钻研,亦可在此项目代码基础上进行修改添加,实现其他不同功能。 欢迎下载!欢迎交流学习!不清楚的可以私信问我! 毕设新项目-基于Java开发的智慧养老院信息管理系统源码+数据库(含vue前端源码).zip毕设新项目-基于Java开发的智慧养老院信息管理系统源码+数据库(含vue前端源码).zip毕设新项目-基于Java开发的智慧养老院信息管理系统源码+数据库(含vue前端源码).zip毕设新项目-基于Java开发的智慧养老院信息管理系统源码+数据库(含vue前端源码).zip毕设新项目-基于Java开发的智慧养老院信息管理系统源码+数据库(含vue前端源码).zip毕设新项目-基于Java开发的智慧养老院信息管理系统源码+数据库(含vue前端源码).zip毕设新项目-基于Java开发的智慧养老院信息管理系统源码+数据库(含vue前端源码).zip毕设新项目-基于Java开发的智慧养老院信息管理系统源码+数据库(含vue前端源码).zip毕设新项目-基于Java开发的智慧养老院信息管理系统源码+数据库(含vue前端源码).zip
综合小区管理系统管理系统按照操作主体分为管理员和用户。管理员的功能包括报修管理、车位管理、车位分配管理、出入管理、字典管理、房屋管理、物业费缴纳管理、公告管理、物业人员投诉管理、我的私信管理、物业人员管理、用户管理、管理员管理。用户的功能包括管理部门以及部门岗位信息,管理招聘信息,培训信息,薪资信息等。该系统采用了Mysql数据库,Java语言,Spring Boot框架等技术进行编程实现。 综合小区管理系统管理系统可以高综合小区管理系统信息管理问题的解决效率,优化综合小区管理系统信息处理流程,保证综合小区管理系统信息数据的安全,它是一个非常可靠,非常安全的应用程序。 管理员权限操作的功能包括管理公告,管理综合小区管理系统信息,包括出入管理,报修管理,报修管理,物业费缴纳等,可以管理操作员。 出入管理界面,管理员在出入管理界面中可以对界面中显示,可以对招聘信息的招聘状态进行查看,可以添加新的招聘信息等。报修管理界面,管理员在报修管理界面中查看奖罚种类信息,奖罚描述信息,新增奖惩信息等。车位管理界面,管理员在车位管理界面中新增。公告管理界面,管理员在公告管理界面查看公告的工作状态,可以对公告的数据进行导出,可以添加新公告的信息,可以编辑公告信息,删除公告信息。
【项目资源】:包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资源、音视频、网站开发等各种技术项目的源码。包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、MATLAB、python、web、C#、EDA、proteus、RTOS等项目的源码。 【项目质量】:所有源码都经过严格测试,可以直接运行。功能在确认正常工作后才上传。 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【附加价值】:项目具有较高的学习借鉴价值,也可直接拿来修改复刻。对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。 【沟通交流】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。鼓励下载和使用,并欢迎大家互相学习,共同进步。【项目资源】:包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资源、音视频、网站开发等各种技术项目的源码。包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、MATLAB、python、web、C#、EDA、proteus、RTOS等项目的源码。 【项目质量】:所有源码都经过严格测试,可以直接运行。功能在确认正常工作后才上传。 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【附加价值】:项目具有较高的学习借鉴价值,也可直接拿来修改复刻。对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。 【沟通交流】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。鼓励下载和使用,并欢迎大家互相学习,共同进步。【项目资源】:包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资源、音视频、网站开发等各种技术项目的源码。包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、MATLAB、python、web、C#、EDA、proteus、RTOS等项目的源码。 【项目质量】:所有源码都经过严格测试,可以直接运行。功能在确认正常工作后才上传。 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【附加价值】:项目具有较高的学习借鉴价值,也可直接拿来修改复刻。对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。 【沟通交流】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。鼓励下载和使用,并欢迎大家互相学习,共同进步。【项目资源】:包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资源、音视频、网站开发等各种技术项目的源码。包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、MATLAB、python、web、C#、EDA、proteus、RTOS等项目的源码。 【项目质量】:所有源码都经过严格测试,可以直接运行。功能在确认正常工作后才上传。 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【附加价值】:项目具有较高的学习借鉴价值,也可直接拿来修改复刻。对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。 【沟通交流】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。鼓励下载和使用,并欢迎大家互相学习,共同进步。【项目资源】:包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资源、音视频、网站开发等各种技术项目的源码。包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、MATLAB、python、web、C#、EDA、proteus、RTOS等项目的源码。 【项目质量】:所有源码都经过严格测试,可以直接运行。功能在确认正常工作后才上传。 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【附加价值】:项目具有较高的学习借鉴价值,也可直接拿来修改复刻。对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。 【沟通交流】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。鼓励下载和使用,并欢迎大家互相学习,共同进步。【项目资源
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值