xtuoj 0x10

Index

Dice I

  • Dice I
    暴力模拟,码如专题名
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
#include<stdio.h>
#include<string.h>

typedef struct{
int top;
int bottom;
int front;
int back;
int left;
int right;
}Dice;

Dice dice = {1, 6, 5, 2, 3, 4};

void rotate(char c){
if(c=='U'){
int temp=dice.top;
dice.top=dice.front;
dice.front=dice.bottom;
dice.bottom=dice.back;
dice.back=temp;
}
if(c=='D'){
int temp=dice.front;
dice.front=dice.top;
dice.top=dice.back;
dice.back=dice.bottom;
dice.bottom=temp;
}
if(c=='Y'){
int temp=dice.front;
dice.front=dice.left;
dice.left=dice.back;
dice.back=dice.right;
dice.right=temp;
}
if(c=='X'){
int temp=dice.front;
dice.front=dice.right;
dice.right=dice.back;
dice.back=dice.left;
dice.left=temp;
}
if(c=='L'){
int temp=dice.top;
dice.top=dice.right;
dice.right=dice.bottom;
dice.bottom=dice.left;
dice.left=temp;
}
if(c=='R'){
int temp=dice.top;
dice.top=dice.left;
dice.left=dice.bottom;
dice.bottom=dice.right;
dice.right=temp;
}
}

int main()
{
char str[300];
while(scanf("%s",str)!=EOF){
int len=strlen(str);
for(int i=0;i<len;i++){
rotate(str[i]);
}
printf("%d\n",dice.top);
dice=(Dice){1, 6, 5, 2, 3, 4};
}
return 0;
}

21Points

  • 21Points
    可以说,如果我没有再写一遍拼图,我想不出这个解法
    我刚开始看到这个题的时候,觉得可以用类似完美回文数的做法来处理,然后当我一通操作后,否定了这个想法
    但是在这个过程中,我发现这个结构可以用搜索+回溯来处理,便立马动手,经过四个小时(思路成型,敲代码,debug),终于干掉这道题了
    这种把以前学过的知识转化成自己的感觉真不错
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
#include<stdio.h>
#include<string.h>

int a[3]={1,10,11};
int num[60000];
char str[11];
int dfs(int cnt,int ans,int index){
cnt--;//cnt==0时不会进入搜索路径,所以要提前处理
for(int i=0;i<3;i++){
ans+=a[i];
if(cnt>0) index=dfs(cnt,ans,index);//搜索
if(ans<=21&&cnt==0) num[index++]=ans;
ans-=a[i];//回溯
}
return index;//设置递归出口
}

int main()
{
int T;
scanf("%d",&T);
while(T--){
scanf("%s",str);
int len=strlen(str),index=0,cnt=0,ans=0,max=-1;
for(int i=0;i<len;i++){
if(str[i]=='J'||str[i]=='Q'||str[i]=='K'){
num[index++]=10;
continue;
}
if(str[i]=='A'){
cnt++;
continue;
}
if(str[i]=='1'&&str[i+1]=='0') num[index++]=10,i++;
else num[index++]=str[i]-'0';
}//感觉这一坨可以封装一下
for(int i=0;i<index;i++) ans+=num[i],num[0]=ans;//初始化num[0]
if(cnt+ans>21){ puts("Boom"); continue; }//情况1
if(cnt==0){ (ans<=21)?printf("%d\n",ans) : puts ("Boom") ; continue; }//情况2
index=dfs(cnt,ans,0);//情况3
for(int i=0;i<index;i++){
if(max<num[i]&&num[i]<=21) max=num[i];
}
if(max==-1) puts("Boom");
else printf("%d\n",max);
}
}

菱形II

  • 菱形II
    一开始写了一份纯粹的暴力解法,虽然没错,但是MLE且TLE。。。。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
#include <stdio.h>
#include <stdlib.h>

long long min[10010],max[10010];

void pre(long long n){
for(long long i=1;i<=n;i++) min[i-1]=1+i*(i-1)/2;
for(long long i=1;i<=n;i++) max[i-1]=n*n-i*(i-1)/2;
}

void foundL(long long *x,long long *y,long long n,long long val){
if(val<min[n-1]){
for(long long i=0;i<n;i++){
if(val-min[i]<0){
long long temp=val-min[i-1];
*x=temp;
*y=i-1-temp;
break;
}
}
}
if(val>max[n-1]){
for(long long i=0;i<n;i++){
if(val>max[i]){
long long temp=max[i-1]-val;
*x=n-temp-1;
*y=n-i+temp;
break;
}
}
}
if(val>=min[n-1]&&val<=max[n-1]){
long long temp=val-min[n-1];
*x=temp;
*y=n-temp-1;
}
}

int main() {
long long T;
scanf("%lld", &T);
while (T--) {
long long n, s, e;
scanf("%lld%lld%lld", &n, &s, &e);
pre(n);
long long sx,sy,ex,ey;
foundL(&sx,&sy,n,s);
foundL(&ex,&ey,n,e);
printf("%lld\n",abs(sx-ex)+abs(sy-ey));
}
return 0;
}

Alice and Bob

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
#include<stdio.h>
#include<string.h>
struct S {
int x;
int y;
};
int main()
{
char str[205];
struct S res[2000];
while (scanf("%s", str) != EOF)
{
int cnt = 0;
int ans = 0;
int len = strlen(str);
if (str[len - 1] == 'L') {
puts("0");
continue;
}
for (int i = 0; i < len; i++)
{
if (str[i] == 'W') cnt++;
}
for (int i = 1; i <= cnt; i++)
{
int m = 0;
int n = 0;
int l = 0;
int r = 0;
for (int j = 0; j < len; j++)
{
if (str[j] == 'L') {
l++;
if (l >= i) {
n++;
l = r = 0;
}
}
else if (str[j] == 'W') {
r++;
if (r >= i) {
m++;
r = l = 0;
}
}
if (j == len - 1) {
if (r == 0)
{
if (m > n) {
res[ans].x = i;
res[ans].y = m;
ans++;
}
}
}
}
}
printf("%d\n", ans);
for (int i = 0; i < ans; i++)
{
printf("%d %d\n", res[i].x, res[i].y);
}
}
}

黑棋与白棋

应该是我写过的码量最大的题目了
。。。。写对角线的逻辑时,想多了,构造了一个只适用于正方形的计数,还想了我好久QAQ
顺便总结一下,在调试坐标类的代码时,打印坐标会方便调试很多

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
#include<stdio.h>
#include<string.h>
typedef struct{
char val;
int row;
int col;
int l;
int r;
}Point;

Point point[20][20]={};

typedef enum{
Row,
Col,
L,
R
}Pro;

int col(char key,int n,Pro pro){
int cnt=0,x,y;
switch(pro){
case Row:
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
if(point[i][j].val==key&&point[i][j].row!=-1){
int col=0;
while(point[i][j++].val==key) col++;
j--;
if(col>=3){
cnt++;
while(col--) point[i][j-col-1].row=-1;
}
}
}
}
break;
case Col:
for(int j=0;j<n;j++){
for(int i=0;i<n;i++){
if(point[i][j].val==key&&point[i][j].col!=-1){
int col=0;
while(point[i++][j].val==key) col++;
i--;
if(col>=3){
cnt++;
while(col--) point[i-col-1][j].col=-1;
}
}
}
}
break;
case L:
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
if(point[i][j].val==key&&point[i][j].l!=-1){
int col=0,cx=i,cy=j;
while(point[cx][cy].val==key&&cx<n&&cy<n) col++,cx++,cy++;
if(col>=3){
cnt++;
while(col--) point[cx-col-1][cy-col-1].l=-1;
}
}
}
}
break;
case R:
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
if(point[i][j].val==key&&point[i][j].r!=-1){
int col=0,cx=i,cy=j;
while(point[cx][cy].val==key&&cx<n&&cy>=0) col++,cx++,cy--;
if(col>=3){
cnt++;
while(col--) point[cx-col-1][cy+col+1].r=-1;
}
}
}
}
break;
}
return cnt;
}

int main()
{
int T;
scanf("%d",&T);
while(T--){
int n;
scanf("%d",&n);
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
scanf(" %c",&point[i][j].val);
}
}
Pro pro[]={Row,Col,L,R};
int w=0,b=0;
for(int i=0;i<4;i++){
w+=col('W',n,pro[i]);
b+=col('B',n,pro[i]);
}
printf("%d %d\n",b,w);
memset(point,0,sizeof(point));
}
return 0;
}

素数螺旋

  • 素数螺旋
    两份代码,一份是我的,一份是老师的。。。。
    老师的思路明显比我的清楚QAQ
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
#include<stdio.h>
#include<string.h>
#define N 1000
int prime[N];
char map[2*N+1][2*N+1];

void genprime(){
for(int i=2;i<N;i++){
if(prime[i]==0){
for(int j=i*i;j<N;j+=i){
prime[j]=1;
}
}
}
int cnt=2;
for(int i=2;i<N;i++){
if(prime[i]==0) prime[cnt++]=i;
}
}

int draw(int n,int i,int cnt,int x,int y){
for(int j=0;j<prime[i+2];j++){
map[x][y+j]='_';
}
cnt++;
if(cnt>=n) return 0;
for(int j=0;j<prime[i+3];j++){
map[x-j][prime[i+2]+y]='|';
}
cnt++;
if(cnt>=n) return 0;
for(int j=prime[i+2]-1;j>prime[i+2]-prime[i+4]-1;j--){
map[x-prime[i+3]][j+y]='_';
}
cnt++;
if(cnt>=n) return 0;
for(int j=prime[i+3]-1;j>prime[i+3]-prime[i+5]-1;j--){
map[x-j][prime[i+2]-prime[i+4]-1+y]='|';
}
cnt++;
if(cnt>=n) return 0;
return draw(n,i+4,cnt,x-prime[i+3]+prime[i+5],y+prime[i+2]-prime[i+4]);//偏移坐标原点
}//递归制造图形

void print() {
int top=2*N,bottom=0,left=2*N,right=0;
for(int i=0;i<2*N;i++){//这两个for循环太耗时了。。。。也不是没有其他的方法来输出,就是我懒得想了
for(int j=0;j<2*N;j++){
if(map[i][j]!=' '){
if(i<top) top=i;
if(i>bottom) bottom=i;
if(j<left) left=j;
if(j>right) right=j;
}
}
}
for(int i=top;i<=bottom;i++){
for(int j=left;j<=right;j++){
printf("%c",map[i][j]);
}
puts("");
}
puts("");
}

int main()
{
genprime();
int T;
scanf("%d",&T);
while(T--){
int n;
scanf("%d",&n);
memset(map,' ',sizeof(map));
draw(n,0,0,999,999);
print();
}
return 0;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
#include <stdio.h>
#include <string.h>

#define N 1200
char s[N][N];
const int ori = 600;
const int dx[] = {0, -1, 0, 1};
const int dy[] = {1, 0, -1, 0};
const int cx[] = {0, 0, 1, -1};
const int cy[] = {0, -1, 0, 1};
int left, right, bottom, top, x, y;

int prime[200];
int t[1001];
int cnt;

void sieve() {
int i, j;
for (i = 2; i < 32; i++) if (!t[i]) {
for (j = i * i; j < 1001; j += i) t[j] = 1;
}
for (i = 2; i < 1001; i++) if (!t[i]) prime[cnt++] = i;
}

void update() {
if (y > right) right = y;
if (y < left) left = y;
if (x < top) top = x;
if (x > bottom) bottom = x;
}

void draw_line(int d, int n) {
char c = "_|"[d % 2];
for (int i = 0; i < n; i++) {
s[x][y] = c;
update();
x += dx[d];
y += dy[d];
}
x += cx[d];
y += cy[d];
}

void out() {
int i, j;
for (i = top; i <= bottom; i++) {
for (j = right; j >= left && s[i][j] == ' '; j--);
s[i][j + 1] = 0;
puts(s[i] + left);
}
puts("");
}

void draw(int n) {
int d = 0;
x = y = left = top = right = bottom = ori;
memset(s, ' ', sizeof(s));
for (int i = 0; i < n; i++) {
draw_line(d, prime[i]);
d = (d + 1) % 4;
}
out();
}

int main() {
sieve();
int T;
scanf("%d", &T);
while (T--) {
int n;
scanf("%d", &n);
draw(n);
}
return 0;
}

交叉点

  • 交叉点
    破防了,x,y数组开小了,一直错QAQ
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
 #include<stdio.h>
#include<string.h>

char map[40][40];
int x[300],y[300];

int check(int i,int j,int n,int m){
int col=0;
/* row */
int cnt=0,x=i,y=j;
while(y>=0&&map[x][y--]=='*') cnt++;
y=j;
while(y<m&&map[x][++y]=='*') cnt++;
if(cnt>=3) col++;
/* column */
cnt=0,x=i,y=j;
while(x>=0&&map[x--][y]=='*') cnt++;
x=i;
while(x<n&&map[++x][y]=='*') cnt++;
if(cnt>=3) col++;
/* right diagonal */
cnt=0,x=i,y=j;
while(x<n&&y<m&&map[x++][y++]=='*') cnt++;
x=i,y=j;
while(x>=0&&y>=0&&map[--x][--y]=='*') cnt++;
if(cnt>=3) col++;
/* left diagonal */
cnt=0,x=i,y=j;
while(x>=0&&y<m&&map[x--][y++]=='*') cnt++;
x=i,y=j;
while(x<n&&y>=0&&map[++x][--y]=='*') cnt++;
if(cnt>=3) col++;
if(col>=2) return 1;
else return 0;
}

void solve(int n,int m,int id){
int cnt=0,index=0;
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
if(map[i][j]=='*'){
if(check(i,j,n,m)){
cnt++;
x[index++]=i,y[index-1]=j;
}
}
}
}
printf("Case %d:%d\n",id,cnt);
if(cnt!=0){
for(int i=0;i<index;i++){
printf("%d %d\n",x[i],y[i]);
}
}
}

int main()
{
int T,id=1;
scanf("%d",&T);
while(T--){
int n,m;
scanf("%d%d",&n,&m);
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
scanf(" %c",&map[i][j]);//这有个细节,因为前面一行有个换行符没有读入,所以这里%c前面有个空格
}
}
solve(n,m,id++);
memset(map,' ',sizeof(map));//找注意初始化,否则会出现错误
}
return 0;
}

表格

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
#include<stdio.h>
#include<string.h>
#define N 100
char table[N][N][N];
char align[N];
int col_width[N];

void print_line(int *col_width,int col){
printf("+");
for(int i=0;i<col;i++){
for(int j=0;j<col_width[i];j++){
printf("-");
}
printf("+");
}
puts("");
}

void print_row(char table[N][N][N],int *col_width,char *align,int row,int col){
printf("|");
for(int i=0;i<col;i++){
int width=col_width[i];
int len=strlen(table[row][i]);
int left,right;
switch(align[i]){
case 'l':
left=1;
right=width-len-left;
break;
case 'r':
right=1;
left=width-len-right;
break;
case 'c':
left=(width-len)>>1;
right=width-len-left;
break;
}
for(int j=0;j<left;j++) printf(" ");
printf("%s",table[row][i]);
for(int j=0;j<right;j++) printf(" ");
printf("|");
}
puts("");
}

int main()
{
int T;
scanf("%d",&T);
while(T--){
int r,c;
scanf("%d%d",&r,&c);
scanf("%s",align);
memset(col_width,0,sizeof(col_width));
for(int i=0;i<r;i++){
for(int j=0;j<c;j++){
scanf("%s",table[i][j]);
int len=strlen(table[i][j]);
if(len>col_width[j]) col_width[j]=len;
}
}
for(int i=0;i<c;i++) col_width[i]+=2;
print_line(col_width,c);
for(int i=0;i<r;i++){
print_row(table,col_width,align,i,c);
print_line(col_width,c);
}
}
return 0;
}

正方形

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
#include <stdio.h>
#include <stdbool.h>

#define N 50
#define MAX 2 * N * (N + 1)

bool sticks[MAX];

int solve(int n) {
int cnt = 0;

// Check all possible squares from 1x1 to nxn
for (int size = 1; size <= n; size++) {
for (int i = 0; i <= n - size; i++) {
for (int j = 0; j <= n - size; j++) {
bool val = true;
// Check the top and bottom borders
for (int k = 0; k < size; k++) {
if (sticks[i * (2 * n + 1) + j + k] || sticks[i * (2 * n + 1) + j + k + size * (2 * n + 1)]) {
val = false;
break;
}
}
// Check the left and right borders
for (int k = 0; k < size; k++) {
if (sticks[i * (2 * n + 1) + j + n + k * (2 * n + 1)] || sticks[i * (2 * n + 1) + j + n + k * (2 * n + 1) + size]) {
val = false;
break;
}
}
if (val) {
cnt++;
}
}
}
}

return cnt;
}

int main() {
int T;
scanf("%d", &T);
while (T--) {
int n, m;
scanf("%d%d", &n, &m);

// Initialize sticks array
for (int i = 0; i < 2 * n * (n + 1); i++) {
sticks[i] = false;
}

// Mark removed sticks
for (int i = 0; i < m; i++) {
int stick;
scanf("%d", &stick);
sticks[stick - 1] = true;
}

// Count remaining squares
int ans = solve(n);
printf("%d\n", ans);
}
return 0;
}

Game

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
#include<stdio.h>
#include<string.h>

char a[6][100];

int getnum(char *s){ return strcmp(s,"PAPER")==0?5:0; }

int tran(char *s){
int num=0;
for(int i=0;i<strlen(s);i++) num=num*10+s[i]-'0';
return num;
}

int judge(){
int sum=0,num=tran(a[4]);
for(int i=0;i<4;i++) sum+=getnum(a[i]);
return num==sum?1:0;
}

int main(){
int id=0,flag=1,Alice=0,Bob=0,win=0,num;
char ch[4][100];
puts("Alice start game 1");
while(scanf("%d %s %s %s %s",&num,ch[0],ch[1],ch[2],ch[3])!=EOF){
sprintf(a[4],"%d",num);
for(int i=0;i<4;i++) strcpy(a[i],ch[i]);
if(win==1) printf("Alice start game %d\n",id+1);
else if(win==-1) printf("Bob start game %d\n",id+1);
if(judge()){
id++;
if(flag){
Alice++;
printf("Alice win game %d\n",id);
win=1;
continue;
}else{
Bob++;
printf("Bob win game %d\n",id);
win=-1;
continue;
}
}else{
if(flag){
flag=0;
puts("Change to Bob");
}else{
flag=1;
puts("Change to Alice");
}
}
win=0;
}
printf("Game over %d:%d\n",Alice,Bob);
return 0;
}

Markdown表格

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
#include<stdio.h>
#include<string.h>
char str[20][210],table[20][20][100];//str记录未分割前的表格,table记录分割后的表格
int str_len[20][20],max_col[20];//str_len记录每个单元格的长度

void putBar(int width){
printf("+");
for(int i=0;i<width;i++){
for(int j=0;j<max_col[i];j++){
printf("-");
}
printf("+");
}
puts("");
}

void putSpace(int len){
for(int i=0;i<len;i++) printf(" ");
}

void getPlace(int width){
for(int i=0;i<width;i++){
int left=0,right=str_len[1][i]-1;
str_len[1][i]=0;//默认居中
if(table[1][i][left]==':') str_len[1][i]=-1;//左
if(table[1][i][right]==':') str_len[1][i]=1;//右
if(table[1][i][left]==':'&&table[1][i][right]==':') str_len[1][i]=0;//中
}
}

void cut(int head,int tail,int num,int i,char table[20][20][100],int str_len[20][20]){
/* 双指针,头指针在第一个|,尾指针在后面一个| */
while(str[i][head++]==' ');
while(str[i][--tail]==' ');
head--;
if(head>tail){//如果全为空格,另作处理
return ;
}
memcpy(table[i][num],str[i]+head,tail-head+1);//记录单元格内容
str_len[i][num]=tail-head+1;//记录长度
}

int getStr(int i,size_t len){//分割整行
int head=0,tail=0,num=0;
while(1){
if(str[i][tail]=='|'){
cut(head,tail,num,i,table,str_len);
num++;
head=tail+1;
}
if(tail==len){//最后没有|,另作处理
cut(head,tail+1,num,i,table,str_len);
num++;
break;
}
tail++;
}
return num;
}

void putStr(int width,int length){
/* 处理第二行 */
getPlace(width);
/* 获得每列的最大长度 */
for(int i=0;i<width;i++){
for(int j=0;j<length;j++){
if(j!=1){
if(str_len[j][i]>max_col[i]-2) max_col[i]=str_len[j][i]+2;
}
}
}
/* 输出表格 */
putBar(width);//首先输出第一行
for(int i=0;i<length;i++){
if(i!=1){
printf("|");
for(int j=0;j<width;j++){//全为空格
int t=str_len[1][j];
if(i==0) t=0;
if(t==0){//居中
int len=str_len[i][j],w=max_col[j],left=(w-len)>>1,right=w-len-left;
putSpace(left),printf("%s",table[i][j]),putSpace(right),printf("|");
continue;
}
if(t==1){//右
int right=1,w=max_col[j],len=str_len[i][j],left=w-len-right;
putSpace(left),printf("%s",table[i][j]),putSpace(right),printf("|");
continue;
}
if(t==-1){//左
int left=1,w=max_col[j],len=str_len[i][j],right=w-len-left;
putSpace(left),printf("%s",table[i][j]),putSpace(right),printf("|");
continue;
}
}
puts("");
}
if(i==0) putBar(width);
}
putBar(width);
}

int main()
{
int i=0,width;
while(fgets(str[i],sizeof(str[i]),stdin)!=NULL){
size_t len=strlen(str[i]);
str[i][len-1]=' ';
width=getStr(i,len-1);
i++;
}
putStr(width,i);
return 0;
}

3个矩形与1个正方形

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
#include<stdio.h>
#include<math.h>
int a[2],b[2],c[2];

int check(int mark,int cnt,int max){
int *arr[]={a,b,c};
int t[3]={0};
if(cnt==3){
for(int i=0;i<3;i++){
if(arr[i][0]==max) t[i]=arr[i][1];
if(arr[i][1]==max) t[i]=arr[i][0];
}
if(t[0]+t[1]+t[2]==max) return 1;
}else{
for(int i=0;i<3;i++){
if(mark==i){
for(int j=0;j<3;j++){
if(j!=mark){
int place=((arr[i][0]==max) ? 1 : 0),flag=0;
for(int k=0;k<2;k++){
if(arr[j][k]+arr[i][place]==arr[i][!place]){
t[j]=arr[j][!k];
flag=1;
break;
}
}
if(!flag) return 0;
}
}
if(t[0]+t[1]+t[2]==max) return 1;
}
}
}
return 0;
}

int main()
{
int T;
scanf("%d",&T);
while(T--){
int *arr[]={a,b,c};
int max=0,sum=0,cnt=0,mark;
for(int i=0;i<3;i++){
int temp=1;
for(int j=0;j<2;j++){
scanf("%d",&arr[i][j]);
temp*=arr[i][j];
if(max<=arr[i][j]) max=arr[i][j],mark=i;
}
sum+=temp;
}
for(int i=0;i<3;i++){
for(int j=0;j<2;j++){
if(arr[i][j]==max) cnt++;
}
}
if(sum!=sqrt(sum)*sqrt(sum)||cnt>3) puts("No");
else {
if(check(mark,cnt,max)) puts("Yes");
else puts("No");
}
}
return 0;
}

完结撒花ヾ(≧▽≦*)o


xtuoj 0x10
http://example.com/2024/12/05/xtuoj-0x10/
Author
Anfsity
Posted on
December 5, 2024
Licensed under