/*ZOJ 1004 Anagrams by Stack 2010.8.14 首先是每出入栈一次,就把它输出到界面上。 这样造成了很多错误且不必要的输出。但正确的输出也在其中。 后参照网上的例子。采用到尾后一次性输出(此时必然正确),解决 了这个这问题。 此算法完全由自己想出。后和网上的例子比较。觉得 char tmp[2 * MAX]; memcpy(tmp,stack,strlen(stack)); 浪费了空间。没有网上的精简。但总体上思想是正确的。 */ #include <iostream> #include <string.h> using namespace std; const int MAX = 1000; int length = 0; void dfs(const char words1[],const char words2[],char stack[],int depth1,int depth2,int top,char record[],int rlength) { if(top >= length || depth1 > length || depth2 > length) return; if(depth2 == length) { for(int i = 0;i < rlength;i++) { cout<< record[i] << ' '; } cout << endl; } char tmp[2 * MAX]; memcpy(tmp,stack,strlen(stack)); if(top > -1 && stack[top] == words2[depth2]) { top ++; tmp[top] = words1[depth1]; depth1 ++; record[rlength] = 'i'; rlength++; dfs(words1,words2,tmp,depth1,depth2,top,record,rlength); top --; depth1 --; rlength--; stack[top] = '/0'; top --; depth2 ++; record[rlength] = 'o'; rlength ++; dfs(words1,words2,stack,depth1,depth2,top,record,rlength); } else { top ++; stack[top] = words1[depth1]; depth1 ++; record[rlength] = 'i'; rlength++; dfs(words1,words2,stack,depth1,depth2,top,record,rlength); } } int main() { char words1[MAX]; char words2[MAX]; char stack[MAX]; char record[2 * MAX]; while(cin >> words1 >> words2) { length = strlen(words1); if(length != strlen(words2)) { cout << '[' << endl << ']' << endl; continue; } cout << '[' << endl; stack[0] = words1[0]; record[0] = 'i'; dfs(words1,words2,stack,1,0,0,record,1); cout << ']' << endl; } return 0; }