??xml version="1.0" encoding="utf-8" standalone="yes"?>
2 #include <cstdio>
3 #include <cstring>
4 const int maxn = 100000 + 5;
5 int last, cur, next[maxn];
6 char s[maxn];
7 int main() {
8
9 while ( scanf("%s", s + 1) == 1) {
10
11 int n = strlen(s + 1);
12 last = cur = 0;
13 next[0] = 0; // 头结点初始化指向自n
14
15 for (int i = 1; i <=n; i++) {
16
17 char ch = s[i];
18 if ('[' == ch ) cur = 0;
19 else if (']' == ch) cur = last;
20 else {
21
22 next[i] = next[cur]; // next[cur]为当前光标的前一个字W,而next[i]是当前光标要输入的字符Q接着Q光标还要蟩C个字W。所以我们要把当前字Wnext指向光标输入的字W。也是next[cur] = i;但要先保存其next指针l输入字W。其next指针其实是真相头结炏V?/span>
23 next[cur] = i;
24 if (cur == last) last = i;
25 cur = i; // 指向下一个节?/span>
26 }
27
28 }
29
30 for (int i = next[0];i != 0; i = next[i]) {
31 printf("%c", s[i]);
32 }
33 puts("");
34 }
35
36 return 0;
37 }
2015/4/12上午12:10:12
]]>
2 #include <iostream>
3 #include <string>
4 #include <stack>
5
6 using namespace std;
7
8 struct Matrix {
9 int r,c;
10 Matrix(int a = 0, int b = 0) : r(a), c(b) {};
11 }m[26];
12
13 stack<Matrix> s;
14
15 int main()
16 {
17
18 int n;
19 cin >> n;
20 for (int i = 0; i < n; i++) {
21 string name;
22 cin >> name;
23 int k = name[0] - 'A';
24 cin >> m[k].r >> m[k].c;
25
26 }
27
28 string expr;
29 while (cin >> expr) {
30
31 int len = expr.size(); // 获取字符串的大小Q因整个字符串都没有I格
32 bool error = false;
33 int ans = 0;
34 for (int i = 0; i < len; i++) { // 循环整个表达式、思\是遇到右括号出栈两个Matrixq行计算Q算完在压回?br />35 // 其实你可以发现带括号的表辑ּ十分W合栈,而不仅仅是该题目Q首先左括号深
36 // 其计的有先U别高Q而右括号又和左括号配对,如果我们从左到右d一个表辑ּ
37 // 每次一遇到xP其前面到左括L部分肯定是q个表达式最优先的部分?/span>
38 if (isalpha(expr[i])) { s.push(m[expr[i] - 'A']); }
39 else if (')' == expr[i]) {
40 Matrix m2 = s.top(); s.pop();
41 Matrix m1 = s.top(); s.pop();
42 if (m1.c != m2.r) { error = true; break; }
43 ans += m1.r * m1.c * m2.c;
44 s.push(Matrix(m1.r, m2.c));
45 }
46
47 }
48
49 if (error) printf("error\n"); else printf("%d\n", ans);
50
51 }
52
53 return 0;
54 }
55
2015/4/10下午6:32:37
By sixleaves
]]>
#include <stdio.h>
#include <string.h>
typedef struct {
int r;
int c;
} Point;
int main() {
const int maxn = 5;
char puzzle[maxn][maxn] = {0};
int kase = 0;
int first = 1;
for (;;) {
// 1.先读取一个字W?span style="font-family: Menlo;">,看是不是Z,不是Z得看看是不是I字W?/p>
char ch;
ch = getchar();
if (ch == 'Z') break;
else {
puzzle[0][0] = ch;
first == 1? first = 0: printf("\n");
}
Point empty;
if (ch == ' ') { empty.r = 0, empty.c = 0; }
// 2.dPuzzle初始化布局
for (int i = 1; i < 25; ) {
ch = getchar();
if (ch == ' ') {
puzzle[ empty.r = i / 5 ][ empty.c = i % 5 ] = ch;
i++;
}
if (ch != ' ' && ch != '\n' && ch != '\t' && ch != '\r') {
puzzle[ i/5 ][ i%5 ] = ch;
i++;
}
}
// 3.执行指o
int configuration = 1;
while ((ch = getchar()) != '0') {
if (ch == '\n' || ch == ' ' || !configuration) continue;
int row = empty.r, col = empty.c;
if (configuration) {
switch (ch) {
case 'A':
if (row - 1 >= 0) {
puzzle[row][col] = puzzle[row - 1][col];
puzzle[row - 1][col] = ' ';
empty.r = row - 1;
empty.c = col;
}else {
configuration = 0;
}
break;
case 'B':
if (row + 1 < maxn) {
puzzle[row][col] = puzzle[row + 1][col];
puzzle[row + 1][col] = ' ';
empty.r = row + 1;
empty.c = col;
}else {
configuration = 0;
}
break;
case 'R':
if (col + 1 < maxn) {
puzzle[row][col] = puzzle[row][col + 1];
puzzle[row][col + 1] = ' ';
empty.r = row;
empty.c = col + 1;
}else {
configuration = 0;
}
break;
case 'L':
if (col - 1 >= 0) {
puzzle[row][col] = puzzle[row][col - 1];
puzzle[row][col - 1] = ' ';
empty.r = row;
empty.c = col - 1;
}else {
configuration = 0;
}
break;
default:
configuration = 0;
break;
}
}
}
// 4.吃掉回R
ch = getchar();
// 5.输出
if (!configuration) {
printf("Puzzle #%d:\nThis puzzle has no final configuration.\n", ++kase);
}else {
printf("Puzzle #%d:\n", ++kase);
for (int row = 0; row < maxn; row++) {
for (int col = 0; col < maxn; col++) {
printf(col == maxn - 1 ? "%c" : "%c ", puzzle[row][col]);
}
printf("\n");
}
}
}
return 0;
}
Z~短领救品的队伍,NNGLRP军_了以下策略:每天所有来甌救济品的Z被放在一个大圆圈Q面朝里面。选定一个h为编?1 P其他的就从那个h开始逆时针开始编L?N。一个官员一开始逆时针数Q数 k 个申误,然后另一个官员第 N 个始时针方向数 m 个申误,q两个hp送去再教肌Ӏ如果两个官员数的是同一个hQ那个h则被送去从政Q然?个官员再在剩下的人里面l选直到没人剩下来Q注意两个被?中的人是同时走掉的,所以就有可能两个官员选中一个h?/p>
输入含有多组试资料Q每l测试资料一列含有三个数 NQk ?mQk, m > 0Q?<N<20Q?当输入ؓ 0 0 0 代表输入l束?/p>
Ҏl测试资料输Z列。输选中的申误的~号序Q一对一对的Q。每个数的宽度ؓ 3 。每一对前面的那个~号为逆时针数的官员选出的,后面的那个编号ؓ时针数的官员选出的(但是如果q?个官员选出同一个hQ那只会有一个编P。每一?之间以逗号分开。格式请参考Sample Output?/p>
10 4 3
13 17 42
7 8 47
0 0 0
4 8, 9 5, 3 1, 2 6, 10, 7q道题目有点l,也讲得不严密。这里主要说下几个容易错的地斏V?br />首先是你每次在写E序之前Q都要十分清除规则,题目中的人是围着一圈,而且W一个的左边是第N个hQ也是它是逆时针标L。这个十分关键?br />其次是go函数的实玎ͼgo函数是数qL个hQ返回最后一个的位置。我q不赞同Q某些版本数l是?开始计敎ͼ因ؓq样对于表达式的表达十分不方ѝ你可以
4 11, 10 1, 8 6, 13 7, 3, 5 12, 9 2
1 3, 5 7, 2 4, 6
Q?Q整值函数的应用。(q个不懂的话Q去看我Math栏目下有q个分析Q?/strong>
Q?Qsscanf、sprintf的应?/strong>
Q?Q分块计的格式问题?/strong>
先直接看代码Q?br /> 1 #include <iostream>