痛苦的数据结构OJ续
数据结构的OJ题目为什么更新这么频繁。。。。
下面的代码有我写的,有搜索之后修改的,。。。但是这么难的题,大部分都还是修改的(那些代码超级长的题)。
Let the Balloon Rise
#include <iostream> #include <cstring> #include <queue> using namespace std; struct node { char x; int i; }; bool operator<(node a, node b) { return a.x > b.x; } class Set{ private: char s[1050][30]; char n; int num[1050]; public: Set() { for (int i = 0; i < 1050; i++) { strcpy(s[i], ""); num[i] = 0; } n = 0; } int find(char *name) { for (int i = 0; i < n; i++) if (! strcmp(s[i], name)) return i; return -1; } void insert(char *name) { int i = find(name); if (i >= 0) num[i]++; else strcpy(s[n++], name); } void show() { int max = 0; priority_queue<node> q; node x; for (int i = 0; i < n; i++) { if (max < num[i]) { max = num[i]; while (! q.empty()) { q.pop(); } x.x = s[i][0]; x.i = i; q.push(x); } else if (max == num[i]){ x.x = s[i][0]; x.i = i; q.push(x); } } while (! q.empty()) { cout << s[q.top().i] << endl; q.pop(); } } }; int main() { int n; char name[30]; while ((cin >> n) && n) { Set s; while (n--) { cin >> name; s.insert(name); } s.show(); } return 0; }
Elevator
#include <iostream> using namespace std; int main() { int x[10000]={0},t,m; while(cin>>m) { if(m!=0) { t=0; for(int i=1;i<=m;i++) { cin>>x[i]; if(x[i-1]<x[i]) { t+=(x[i]-x[i-1])*6; } if(x[i-1]>x[i]) { t+=(x[i-1]-x[i])*4; } t+=5; } cout<<t<<endl; } else break; } return 0; }
彩色字符串
#include <iostream> #include <cstdio> #include <stack> using namespace std; int fun(char x) { if (x == '(') return 1; if (x == '<') return 2; if (x == '[') return 3; if (x == ']' || x == ')' || x == '>') return -1; return 0; } int ans[5]; int main() { int n,idx; char x; cin >> n; getchar(); while (n--) { stack<char> s; ans[1] = ans[2] = ans[3] = 0; while (1) { x = getchar(); if (x == '\n') { cout << ans[1] << " " << ans[2] << " " << ans[3] << endl; break; } if (! fun(x)) ans[idx]++; else if (fun(x) > 0) { s.push(x); idx = fun(x); }else { s.pop(); if (! s.empty()) idx = fun(s.top()); else idx = 0; } } } return 0; }
愚人节的礼物
#include <iostream> using namespace std; int main(){ char a[1010]; while (cin>>a) { int i=0; int num=0; while (a[i]!='\0') { if (a[i]=='(') { num++; }else if(a[i]==')'){ num--; }else{ cout<<num<<endl; break; } i++; } } return 0; }
迷宫
#include<string.h> #include<ctype.h> #include<malloc.h> #include<limits.h> #include<stdio.h> #include<stdlib.h> #define TRUE 1 #define FALSE 0 #define OK 1 #define ERROR 0 #define INFEASIBLE -1 #define OVERFLOW 0 typedef int Status; typedef int Boolean; #define MAXLENGTH 25 #define STACK_INIT_SIZE 10 #define STACKINCREMENT 2 typedef struct { int r, c; } PosType; typedef struct { int ord; PosType seat; int di; } SElemType; typedef struct { SElemType * base; SElemType * top; int stacksize; } SqStack; typedef struct { char arr[10][11]; } MazeType; Status Pass(MazeType MyMaze, PosType CurPos) { if (MyMaze.arr[CurPos.r][CurPos.c]==' ' || MyMaze.arr[CurPos.r][CurPos.c]=='S' || MyMaze.arr[CurPos.r][CurPos.c]=='E') return 1; else return 0; } void FootPrint(MazeType &MyMaze, PosType CurPos) { MyMaze.arr[CurPos.r][CurPos.c] = '*'; } PosType NextPos(PosType CurPos, int Dir) { PosType ReturnPos; switch (Dir) { case 1: ReturnPos.r = CurPos.r; ReturnPos.c = CurPos.c + 1; break; case 2: ReturnPos.r = CurPos.r + 1; ReturnPos.c = CurPos.c; break; case 3: ReturnPos.r = CurPos.r; ReturnPos.c = CurPos.c - 1; break; case 4: ReturnPos.r = CurPos.r - 1; ReturnPos.c = CurPos.c; break; } return ReturnPos; } void MarkPrint(MazeType &MyMaze, PosType CurPos) { MyMaze.arr[CurPos.r][CurPos.c] = '!'; } Status InitStack(SqStack *S) { (*S).base=(SElemType *)malloc(STACK_INIT_SIZE*sizeof(SElemType)); if(!(*S).base) exit(OVERFLOW); (*S).top=(*S).base; (*S).stacksize=STACK_INIT_SIZE; return OK; } Status Push(SqStack *S,SElemType e) { if((*S).top-(*S).base>=(*S).stacksize) { (*S).base=(SElemType *)realloc((*S).base,((*S).stacksize+STACKINCREMENT)*sizeof(SElemType)); if(!(*S).base) exit(OVERFLOW); (*S).top=(*S).base+(*S).stacksize; (*S).stacksize+=STACKINCREMENT; } *((*S).top)++=e; return OK; } Status StackEmpty(SqStack S) { if(S.top==S.base) return TRUE; else return FALSE; } Status Pop(SqStack *S,SElemType *e) { if((*S).top==(*S).base) return ERROR; *e=*--(*S).top; return OK; } Status MazePath(MazeType &maze, PosType start, PosType end) { SqStack S; PosType curpos; int curstep; SElemType e; InitStack(&S); curpos = start; curstep = 1; do { if (Pass(maze, curpos)) { FootPrint(maze, curpos); e.di = 1; e.ord = curstep; e.seat = curpos; Push(&S, e); if (curpos.r == end.r && curpos.c == end.c) return (TRUE); curpos = NextPos(curpos, 1); curstep++; } else { if (!StackEmpty(S)) { Pop(&S, &e); while (e.di == 4 && !StackEmpty(S)) { MarkPrint(maze, e.seat); Pop(&S, &e); } if (e.di < 4) { e.di++; Push(&S, e); curpos = NextPos(e.seat, e.di); } } } } while (!StackEmpty(S)); return FALSE; } int main() { int i, j; PosType start, end; MazeType maze; memset(maze.arr, 0, sizeof(maze.arr)); for(i=0; i<10; i++) { gets(maze.arr[i]); for(j=0; j<10; j++) { if(maze.arr[i][j] == 'S') { start.r = i; start.c = j; } else if(maze.arr[i][j] == 'E') { end.r = i; end.c = j; } } } MazePath(maze, start, end); for(i=0; i<10; i++) { puts(maze.arr[i]); } return 0; }
表达式求值
#include <iostream> #include <stack> #include <queue> using namespace std; int isp(char x) { if (x == '#') return 0; if (x == '(') return 1; if (x == '*' || x == '/' || x == '%') return 5; if (x == '+' || x == '-') return 3; if (x == ')') return 6; } int icp(char x) { if (x == '#') { return 0; } if (x == '(') return 6; if (x == '*' || x == '/' || x == '%') return 4; if (x == '+' || x == '-') return 2; if (x == ')') return 1; } double fun(double a, double b, char x) { if (x == '+') return a + b; if (x == '-') return a - b; if (x == '*') return a * b; if (x == '/') return a / b; } int main () { char x; int n = 0; stack<char> op; stack<double> num; op.push('#'); double a, b; queue<int> q; while (cin >> x) { if (x >= '0' && x <= '9') { n = n * 10 + x - '0'; cin >> x; if (! (x >= '0' && x <= '9')) { num.push(n); n = 0; } cin.putback(x); continue; } if (icp(x) < isp(op.top())) { while (icp(x) < isp(op.top())) { b = num.top(); num.pop(); a = num.top(); num.pop(); num.push(fun(a, b, op.top())); op.pop(); } } if (icp(x) > isp(op.top())) { op.push(x); } if (x == ')') { op.pop(); } if (x == '#') { cout << num.top() << endl; while (! num.empty()) { num.pop(); } while (! op.empty()) { op.pop(); } op.push('#'); n = 0; } } return 0; }
n阶Hanoi塔问题
#include <iostream> #include <iomanip> using namespace std; char s1[] = {'Y', 'Z'}; char s2[] = {'X', 'Y'}; void hanoi(int n, char from, char to, char xx, int &i) { if (n == 1) { cout << setw(2) << i << ". Move disk " << n << " from " << from << " to " << to << endl; i++; return; } hanoi(n - 1, from, xx, to, i); cout << setw(2) << i << ". Move disk " << n <<" from " << from << " to " << to << endl; i++; hanoi(n - 1, xx, to, from, i); } int main() { int n; while (cin >> n) { int i = 1; hanoi(n, 'X', 'Z', 'Y', i); cout << endl; } return 0; }
定位子串
#include <iostream> #include <cstring> using namespace std; int main() { char str1[150], str2[150]; char *s; while (cin >> str1) { cin >> str2; s = strstr(str1, str2); if (s == NULL) cout << 0 << endl; else cout << (s - str1) / sizeof(char) + 1 << endl; } return 0; }
字符串插入
#include <iostream> #include <cstring> using namespace std; int main() { char s1[200], s2[200]; int n; while (cin >> s1 >> s2 >> n) { int l1 = strlen(s1); int l2 = strlen(s2); for (int i = 0; i < n - 1; i++) { cout << s1[i]; } for (int i = 0; i < l2; i++) { cout << s2[i]; } for (int i = n - 1; i < l1; i++) { cout << s1[i]; } cout << endl; } return 0; }
求子串位置的定位函数
#include <iostream> #include <cstring> using namespace std; int main() { char s1[1000],s2[1000]; while (cin >> s1 >> s2) { int i = 0; for (; i < strlen(s1); i++) { cout << s1[i]; if (s1[i] == s2[0]) { int j = 1; for (; j < strlen(s2); j++) { if (i + j < strlen(s1)) cout << s1[i + j]; if (i + j >= strlen(s1) || s1[i + j] != s2[j]) break; } if (j == strlen(s2)) { cout << endl << i + 1 << endl; break; } } } if (i == strlen(s1)) { cout << endl << 0 << endl; } } return 0; }
KMP算法中的模式串移动数组
#include <iostream> #include <cstring> using namespace std; void get_next(char *t, int *next) { int i = 1; next[1] = 0; int j = 0; while (i < t[0]) { if (j == 0 || t[i] == t[j]) { ++i; ++j; next[i] = j; }else j = next[j]; } } int main() { char s[105],t[105]; while (cin>>s){ t[0]=strlen(s); strcpy(t+1,s); int next[1000]; get_next(t,next); for (int i=1;i<=t[0];i++) { cout<<next[i]<< " "; } cout<<endl; } return 0; }
KMP字符串模式匹配算法实现
#include <iostream> #include <cstring> using namespace std; class SString{ private: char *s; char len; public: SString(char *ss) { set(ss); } void set(char *ss) { s = ss; len = strlen(s); } char& operator[](int index) { if (index == 0) { return len; } return s[index - 1]; } }; void get_next(SString t, int *next) { int i = 1; next[1] = 0; int j = 0; while (i < t[0]) { if (j == 0 || t[i] == t[j]) { ++i; ++j; next[i] = j; }else j = next[j]; } } int Index_KMP(SString S, SString T, int pos) { int next[255]; int i = pos; int j = 1; get_next(T, next); while (i <= S[0] && j <= T[0]) { if (j == 0 || S[i] == T[j]) { ++i; ++j; }else { j = next[j]; } } if (j > T[0]) return i - T[0]; else return 0; } int main() { char s1[105], s2[105]; while (cin >> s1 >> s2) { cout << Index_KMP(SString(s1), SString(s2), 1) << endl; } return 0; }
稀疏矩阵转置
#include <iostream> #include <iomanip> using namespace std; template<class T> struct Trituple { int row; int col; T val; }; template<class T> class SparseMatrix { public: SparseMatrix(int maxt=100); ~SparseMatrix(); bool TransposeTo(SparseMatrix &); bool AddTo(const SparseMatrix&); void Input(); void Output(); private: Trituple<T>* data; int rows,cols,terms; int maxterms; }; template<class T> SparseMatrix<T>::SparseMatrix(int maxt) { maxterms=maxt; data=new Trituple<T>[maxterms]; terms=rows=cols=0; } template<class T> SparseMatrix<T>::~SparseMatrix() { if (data!=NULL) { delete[] data; } } template<class T> bool SparseMatrix<T>::TransposeTo(SparseMatrix &B) { if (terms>B.maxterms) { return false; } B.rows=cols; B.cols=rows; B.terms=terms; if (terms>0) { int p=0; for (int j=1;j<=cols;j++) { for (int k=0;k<terms;k++) { if (data[k].col==j) { B.data[p].row=j; B.data[p].col=data[k].row; B.data[p].val=data[k].val; p++; } } } } return true; } template<class T> void SparseMatrix<T>::Input() { int row1,col1,number; cin>>row1>>col1; rows=row1; cols=col1; for (int i=0;i<rows;i++) { for (int j=0;j<cols;j++) { cin>>number; if (number!=0) { data[terms].row=i+1; data[terms].col=j+1; data[terms].val=number; terms++; } } } } template<class T> void SparseMatrix<T>::Output() { T **tempArray=new T*[rows]; for (int i1=0;i1<rows;i1++) { tempArray[i1]=new int[cols]; } for (int j=0;j<rows;j++) { for (int k=0;k<cols;k++) { tempArray[j][k]=0; } } for (int i=0;i<terms;i++) { tempArray[data[i].row-1][data[i].col-1]=data[i].val; } for (int j=0;j<rows;j++) { for (int k=0;k<cols;k++) { cout<<tempArray[j][k]<<" "; } cout<<endl; } for (int l=0;l<rows;l++) { delete[] tempArray[l]; } delete tempArray; cout<<endl; } template<class T> bool SparseMatrix<T>::AddTo(const SparseMatrix& B) { if (rows!=B.rows||cols!=B.cols) { return false; } bool flag=false; int tempTerms=terms; for (int i=0;i<B.terms;i++) { flag=false; for (int j=0;j<tempTerms;j++) { if (data[j].col==B.data[i].col&&data[j].row==B.data[i].row) { data[j].val+=B.data[i].val; flag=true; } } if (flag==false) { data[++terms-1].col=B.data[i].col; data[terms-1].row=B.data[i].row; data[terms-1].val=B.data[i].val; } } return true; } int main() { SparseMatrix<int> sm(50); SparseMatrix<int> sm1(50); SparseMatrix<int> sm2(50); sm.Input(); sm.TransposeTo(sm1); sm1.Output(); return 0; }
稀疏矩阵快速转置
这道题我提交了十次才AC。。。。
#include<iostream> using namespace std; #define MAXROW 250 #define MAXSIZE 12500 typedef int ElemType; typedef struct { int i, j; ElemType e; }Triple; typedef struct { Triple data[MAXSIZE + 1]; int n, m, t; }Matrix; void Inst(Matrix &a) { int i, j; ElemType tmp; cin>>a.n>>a.m; a.t = 0; for (i = 1; i <= a.n; i++) { for (j = 1; j <= a.m; j++) { cin>>tmp; if (tmp) { a.t++; a.data[a.t].i = i; a.data[a.t].j = j; a.data[a.t].e = tmp; } } } } void Trans(Matrix a, Matrix &b) { int num[MAXROW + 1] = { 0 }, pos[MAXROW + 1] = { 0 }; int i, j, p; b.n = a.m; b.m = a.n; b.t = a.t; for (i = 1; i <= a.t; i++) num[a.data[i].j]++; for (i = 1; i <= a.m; i++) pos[i] = pos[i - 1] + num[i]; for (i = a.t; i >= 1; i--) { p = pos[a.data[i].j]--; b.data[p].i = a.data[i].j; b.data[p].j = a.data[i].i; b.data[p].e = a.data[i].e; } } void Out(Matrix a) { int i, j; int u = 1; for (i = 1; i <= a.n; i++) { for (j = 1; j <= a.m; j++) if (i == a.data[u].i && j == a.data[u].j) cout<<a.data[u++].e<<" "; else cout<<"0"<<" "; cout<<endl; } } int main() { Matrix a, b; Inst(a); Trans(a, b); Out(b); return 0; }
相关推荐
koushr 2020-11-12
zhangxiafll 2020-11-13
kikaylee 2020-10-31
范范 2020-10-28
MILemon 2020-10-22
hugebawu 2020-10-12
LauraRan 2020-09-28
shenwenjie 2020-09-24
omyrobin 2020-09-23
guangcheng 2020-09-22
qiangde 2020-09-13
hanyujianke 2020-08-18
晨曦之星 2020-08-14
xiesheng 2020-08-06
KAIrving 2020-08-02
xiesheng 2020-08-02
范范 2020-07-30
chenfei0 2020-07-30