一:题目

系统提示当前旗手W/B(白/黑)下子,例如W下子,那么W下的位置必须是夹住黑色棋子的位置才可以。

夹住方式:横向、竖向、斜向

注意落子后将夹住的黑棋吞噬变为白棋

(一)题目详解

.棋盘以数组表示,“W”表示白子,“B”表示黑子,“-”表示空格
.棋盘大小8行8列

(二)样例输入

2            //第一行是游戏局数
--------        //开始输入棋盘
--------
--------
---WB---
---BW---
--------
--------
--------
W            //棋盘后,直接输入当前旗手
L            //L是提示命令,如果当前有位置可以下子,则提示(3,5) (4,6) (5,3) (6,4) <前面是可以走的坐标>,如果没有位置可以走,提示No legal move. 则轮到对方黑棋下子。
M35           //M是下子命令,35表示落子在3行5列,落子后显示当前棋盘剩余棋子数 Black - 1 White - 4
L
Q            //Q是退出命令,退出时将当前棋盘数据打印
WWWWB---
WWWB----
WWB-----
WB------
--------
--------
--------
--------
B
L
M25
L
Q

(三)样例输出

(,) (,) (,) (,)  //对于L提示命令
Black - White - 4  //对于M35落子命令,提示棋盘当前棋子数
(,) (,) (,)    //对于L提示命令
--------          //对于Q退出命令,打印棋盘
--------
----W---
---WW---
---BW---
--------
--------
--------
No legal move.
Black - White -
(,)
WWWWB---
WWWWW---
WWB-----
WB------
--------
--------
--------
--------

二:代码实现

(一)第一版本:400+行,但是解析详细

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h> #define N 8 char QP[N+][N+]; //棋盘信息
char player; //旗手信息
char OP; //对手信息 bool Oper[]; //获取操作数据

信息获取和展示

//获取棋盘信息、旗手信息
void getQPInfo()
{
//获取棋盘信息
for (int i = ; i <= N; i++)
{
for (int j = ; j <= N; j++)
scanf("%c", &QP[i][j]);
getchar();
}
//获取旗手信息、对手信息
scanf("%c", &player);
while (player=='\n')
scanf("%c", &player); player == 'W' ? OP = 'B' : OP = 'W';
getchar();
} //打印棋盘信息
void showQPInfo()
{
for (int i = ; i <= N; i++)
{
for (int j = ; j <= N; j++)
printf("%c", QP[i][j]);
printf("\n");
}
} //打印可以走的步数
void printDataOper()
{
for (int i = ; i <= ; i++)
if (Oper[i])
printf("(%d,%d) ", i / , i % );
printf("\n");
} //打印棋子数目
void printNumber()
{
int w = , b = ;
for (int i = ; i <= N; i++)
for (int j = ; j <= N; j++)
if (QP[i][j] == 'W')
w++;
else if (QP[i][j] == 'B')
b++; printf("Black - %d White - %d\n", b, w);
} //交换旗手位置
void ExchangePlayer()
{
if (player == 'W')
{
player = 'B';
OP = 'W';
}
else
{
player = 'W';
OP = 'B';
}
}

若是落子后,将夹住的对方棋子同化《版本二简化》

void dealAllOP(int n, int m)
{
//判断四周是否有对手棋子
int x, y; //先判断左上
x = n-, y = m-;
if (x >= && y >= && QP[x][y] == OP)
{
//夹住对手
while (QP[x][y] == OP&&x >= && y >= )
{
x--;
y--;
}
if (x >= && y >= && QP[x][y] == player) //对面也是自己棋子,成功夹住,可以吞噬
{
x = n - , y = m - ;
while (x >= && y >= &&QP[x][y]!='-')
{
QP[x][y] = player;
x--;
y--;
}
}
} //再判断上方
x = n-, y = m;
if (x >= && QP[x][y] == OP)
{
//夹住对手
while (QP[x][y] == OP&&x >= )
{
x--;
}
if (x >= && QP[x][y] == player) //对面也是自己棋子,成功夹住,可以吞噬
{
x = n - , y = m;
while (x >= && QP[x][y] != '-')
{
QP[x][y] = player;
x--;
}
}
} //再判断右上
x = n - , y = m + ;
if (x >= && y<= && QP[x][y] == OP)
{
//夹住对手
while (QP[x][y] == OP&&x >= && y <= )
{
x--;
y++;
}
if (x >= && y <= && QP[x][y] == player) //对面也是自己棋子,成功夹住,可以吞噬
{
x = n - , y = m + ;
while (x >= && y <= && QP[x][y] != '-')
{
QP[x][y] = player;
x--;
y++;
}
}
} //再判断左
y = m - ,x=n;
if (y >= && QP[x][y] == OP)
{
//夹住对手
while (QP[x][y] == OP&&y >= )
{
y--;
}
if (y>= && QP[x][y] == player) //对面也是自己棋子,成功夹住,可以吞噬
{
y = m - , x = n;
while (y >= && QP[x][y] != '-')
{
QP[x][y] = player;
y--;
}
}
} //再判断右
x = n, y = m+;
if (y <= && QP[x][y] == OP)
{
//夹住对手
while (QP[x][y] == OP&&y <= )
{
y++;
}
if (y <= && QP[x][y] == player) //对面也是自己棋子,成功夹住,可以吞噬
{
x = n, y = m + ;
while (y <= && QP[x][y] != '-')
{
QP[x][y] = player;
y++;
}
}
} //再判断左下
x = n + , y = m - ;
if (x <= && y >= && QP[x][y] == OP)
{
//夹住对手
while (QP[x][y] == OP&&x <= && y >= )
{
x++;
y--;
}
if (x <= && y >= && QP[x][y] == player) //对面也是自己棋子,成功夹住,可以吞噬
{
x = n + , y = m - ;
while (x <= && y >= && QP[x][y] != '-')
{
QP[x][y] = player;
x++;
y--;
}
}
} //再判断下
x = n + , y = m;
if (x <= && QP[x][y] == OP)
{
//夹住对手
while (QP[x][y] == OP&&x <= )
{
x++;
}
if (x <= && QP[x][y] == player) //对面也是自己棋子,成功夹住,可以吞噬
{
x = n + , y = m;
while (x <= && QP[x][y] != '-')
{
QP[x][y] = player;
x++;
}
}
} //再判断右下
x = n + , y = m + ;
if (x <= && y <= && QP[x][y] == OP)
{
//夹住对手
while (QP[x][y] == OP&&x <= && y <= )
{
x++;
y++;
}
if (x <= && y <= && QP[x][y] == player) //对面也是自己棋子,成功夹住,可以吞噬
{
x = n + , y = m + ;
while (x <= && y <= && QP[x][y] != '-')
{
QP[x][y] = player;
x++;
y++;
}
}
}
}

判断对方棋子四周8个方向是否可以落子《版本二简化》

bool judgePlayAtSite(int n,int m)
{
bool flag = false;
int x, y; //先判断左上
x = n, y = m;
if ((x - ) >= && (y - ) >= && QP[x - ][y - ] == '-')
{
//可以落子,判断是否合理
while (QP[x][y]==OP&&x<=&&y<=)
{
x++;
y++;
}
if (x <= && y <= &&QP[x][y] == player) //位置合理 落子合理
{
Oper[(n-) * + m-] = true;
flag = true;
}
} //再判断上方
x = n, y = m;
if ((x - ) >= && QP[x - ][y] == '-')
{
//可以落子,判断是否合理
while (QP[x][y] == OP&&x <= )
x++;
if (x <= && QP[x][y] == player) //位置合理 落子合理
{
Oper[(n - ) * + m] = true;
flag = true;
}
} //再判断右上
x = n, y = m;
if ((x - ) >= && (y + ) <= && QP[x - ][y + ] == '-')
{
//可以落子,判断是否合理
while (QP[x][y] == OP&&x <= && y >= )
{
x++;
y--;
}
if (x <= && y >= && QP[x][y] == player) //位置合理 落子合理
{
Oper[(n-) * + m+] = true;
flag = true;
}
} //再判断左
x = n, y = m;
if ((y - ) >= && QP[x][y - ] == '-')
{
//可以落子,判断是否合理
while (QP[x][y] == OP && y <= )
{
y++;
}
if (y <= && QP[x][y] == player) //位置合理 落子合理
{
Oper[n * + m-] = true;
flag = true;
}
} //再判断右
x = n, y = m;
if ((y + ) <= && QP[x][y + ] == '-')
{
//可以落子,判断是否合理
while (QP[x][y] == OP && y >= )
{
y--;
}
if (y >= && QP[x][y] == player) //位置合理 落子合理
{
Oper[n * + m+] = true;
flag = true;
}
} //再判断左下
x = n, y = m;
if ((x + ) <= && (y - ) >= && QP[x + ][y - ] == '-')
{
//可以落子,判断是否合理
while (QP[x][y] == OP&&x >= && y <= )
{
x--;
y++;
}
if (x >= && y <= && QP[x][y] == player) //位置合理 落子合理
{
Oper[(n+) * + m-] = true;
flag = true;
}
} //再判断下
x = n, y = m;
if ((x + ) <= && QP[x + ][y] == '-')
{
//可以落子,判断是否合理
while (QP[x][y] == OP&&x >= )
{
x--;
}
if (x >= && QP[x][y] == player) //位置合理 落子合理
{
Oper[(n+) * + m] = true;
flag = true;
}
} //再判断右下
x = n, y = m;
if ((x + ) <= && (y + ) <= && QP[x + ][y + ] == '-')
{
//可以落子,判断是否合理
while (QP[x][y] == OP&&x >= && y >= )
{
x--;
y--;
}
if (x >= && y >= && QP[x][y] == player) //位置合理 落子合理
{
Oper[(n+) * + m+] = true;
flag = true;
}
} return flag;
}

判断是否当前旗手是否可以落子

bool judgeRunPlayer()
{
//初始化步操作
bool flag = false;
memset(Oper, false, sizeof(Oper)); //循环棋盘,找到对方棋子,判断对方棋子四周是否可以落子
for (int i = ; i <= N; i++)
{
for (int j = ; j <= N; j++)
{
if (QP[i][j] == OP) //判断四周是否可以落子
if (judgePlayAtSite(i, j))
flag = true;
}
} //如果步数无效,则调换对手
if (flag == false)
ExchangePlayer();
return flag;
}

处理命令

void dealCommand()
{
char comm;
int x, y, temp;
while ()
{
scanf("%c", &comm);
switch (comm)
{
case 'M': //落子
scanf("%d", &temp);
x = temp / ;
y = temp % ;
//开始处理棋盘信息
QP[x][y] = player;
dealAllOP(x, y);
ExchangePlayer();
printNumber(); //输出棋盘棋子数
break;
case 'L': //提示信息
//先判断当前旗手是否可以落子
if (judgeRunPlayer()) //打印数据
printDataOper();
else
printf("No legal move.\n");
break;
case 'Q': //退出游戏、打印棋盘
showQPInfo();
printf("\n");
getchar();
return;
}
getchar();
}
}

主函数

int main()
{
FILE* fp = freopen("data3.in", "r", stdin);
freopen("data3.out", "w", stdout);
int num; scanf("%d", &num);
getchar(); while (num--)
{
getQPInfo();
dealCommand();
} freopen("CON", "r", stdin);
freopen("CON", "w", stdout);
return ;
}

(二)第二版本:200+行,对两处函数进行了修改,含空行和注释

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h> #define N 8 char QP[N+][N+]; //棋盘信息
char player; //旗手信息
char OP; //对手信息 bool Oper[]; //获取操作数据 //8个方向 左上、上、右上、左、右、左下、下、右下
int x_dir[] = { -, -, -, , , , , };
int y_dir[] = { -, , , -, , -, , }; //获取棋盘信息、旗手信息
void getQPInfo()
{
//获取棋盘信息
for (int i = ; i <= N; i++)
{
for (int j = ; j <= N; j++)
scanf("%c", &QP[i][j]);
getchar();
}
//获取旗手信息、对手信息
scanf("%c", &player);
while (player=='\n')
scanf("%c", &player); player == 'W' ? OP = 'B' : OP = 'W';
getchar();
}
//打印棋盘信息
void showQPInfo()
{
for (int i = ; i <= N; i++)
{
for (int j = ; j <= N; j++)
printf("%c", QP[i][j]);
printf("\n");
}
}
//打印可以走的步数
void printDataOper()
{
for (int i = ; i <= ; i++)
if (Oper[i])
printf("(%d,%d) ", i / , i % );
printf("\n");
}
//打印棋子数目
void printNumber()
{
int w = , b = ;
for (int i = ; i <= N; i++)
for (int j = ; j <= N; j++)
if (QP[i][j] == 'W')
w++;
else if (QP[i][j] == 'B')
b++; printf("Black - %d White - %d\n", b, w);
}
//交换旗手位置
void ExchangePlayer()
{
if (player == 'W')
{
player = 'B';
OP = 'W';
}
else
{
player = 'W';
OP = 'B';
}
}
//判断对方四周是否可以落子
bool judgePlayAtSite(int n, int m)
{
bool flag = false;
int x, y; for (int i = ; i < ; i++) //循环8个方向
{
x = n, y = m;
if ((x + x_dir[i]) >= && (x + x_dir[i]) <= && (y + y_dir[i]) >= && (y + y_dir[i]) <= && QP[x + x_dir[i]][y + y_dir[i]] == '-')
{
//可以落子,判断是否合理
while (QP[x][y] == OP&&x <= && x >= && y <= && y >= )
{
x -= x_dir[i];
y -= y_dir[i];
}
if (x <= && x >= && y <= && y >= && QP[x][y] == player) //位置合理 落子合理
{
Oper[(n + x_dir[i]) * + m + y_dir[i]] = true;
flag = true;
}
}
} return flag;
}
//将当前落子后的棋子夹住的棋子吞噬
void dealAllOP(int n, int m)
{
//判断四周是否有对手棋子
int x, y; for (int i = ; i < ; i++)
{
x = n + x_dir[i], y = m + y_dir[i];
if (x >= && x <= && y >= && y <= && QP[x][y] == OP)
{
//夹住对手
while (QP[x][y] == OP&&x >= && x <= && y >= && y <= )
{
x += x_dir[i];
y += y_dir[i];
}
if (x >= && x <= && y >= && y <= && QP[x][y] == player) //对面也是自己棋子,成功夹住,可以吞噬
{
x = n + x_dir[i], y = m + y_dir[i];
while (x >= && x <= && y >= && y <= && QP[x][y] != '-')
{
QP[x][y] = player;
x += x_dir[i];
y += y_dir[i];
}
}
}
}
}
//判断是否当前旗手是否可以落子
bool judgeRunPlayer()
{
//初始化步操作
bool flag = false;
memset(Oper, false, sizeof(Oper)); //循环棋盘,找到对方棋子,判断对方棋子四周是否可以落子
for (int i = ; i <= N; i++)
{
for (int j = ; j <= N; j++)
{
if (QP[i][j] == OP) //判断四周是否可以落子
if (judgePlayAtSite(i, j))
flag = true;
}
} //如果步数无效,则调换对手
if (flag == false)
ExchangePlayer();
return flag;
}
//处理命令
void dealCommand()
{
char comm;
int x, y, temp;
while ()
{
scanf("%c", &comm);
switch (comm)
{
case 'M': //落子
scanf("%d", &temp);
x = temp / ;
y = temp % ;
//开始处理棋盘信息
QP[x][y] = player;
dealAllOP(x, y);
ExchangePlayer();
printNumber(); //输出棋盘棋子数
break;
case 'L': //提示信息
//先判断当前旗手是否可以落子
if (judgeRunPlayer()) //打印数据
printDataOper();
else
printf("No legal move.\n");
break;
case 'Q': //退出游戏、打印棋盘
showQPInfo();
printf("\n");
getchar();
return;
}
getchar();
}
}
//主函数
void main()
{
FILE* fp = freopen("data3.in", "r", stdin);
freopen("data3.out", "w", stdout);
int num;
scanf("%d", &num);
getchar(); while (num--)
{
getQPInfo();
dealCommand();
} freopen("CON", "r", stdin);
freopen("CON", "w", stdout);
}

(三)第三版本:100+行,同网上其他形式,去掉注释,进行空行缩减,语句简写

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define N 8
char QP[N+][N+]; //棋盘信息
char player; //旗手信息
char OP; //对手信息
bool Oper[]; //获取操作数据
int x_dir[] = { -, -, -, , , , , };
int y_dir[] = { -, , , -, , -, , };
void getQPInfo()
{
for (int i = ; i <= N; i++)
{
for (int j = ; j <= N; j++)
scanf("%c", &QP[i][j]);
getchar();
}
scanf("%c", &player);
while (player == '\n') scanf("%c", &player);
player == 'W' ? OP = 'B' : OP = 'W';
getchar();
}
void showQPInfo()
{
for (int i = ; i <= N; i++)
{
for (int j = ; j <= N; j++)
printf("%c", QP[i][j]);
printf("\n");
}
}
void printDataOper()
{
for (int i = ; i <= ; i++)
if (Oper[i]) printf("(%d,%d) ", i / , i % );
printf("\n");
}
void printNumber()
{
int w = , b = ;
for (int i = ; i <= N; i++)
for (int j = ; j <= N; j++)
if (QP[i][j] == 'W') w++;
else if (QP[i][j] == 'B') b++;
printf("Black - %d White - %d\n", b, w);
}
void ExchangePlayer()
{
if (player == 'W') player = 'B', OP = 'W';
else player = 'W', OP = 'B';
}
bool judgePlayAtSite(int n, int m)
{
bool flag = false;
int x, y;
for (int i = ; i < ; i++) //循环8个方向
{
x = n, y = m;
if ((x + x_dir[i]) >= && (x + x_dir[i]) <= && (y + y_dir[i]) >= && (y + y_dir[i]) <= && QP[x + x_dir[i]][y + y_dir[i]] == '-')
{
while (QP[x][y] == OP&&x <= && x >= && y <= && y >= )
x -= x_dir[i],y -= y_dir[i];
if (x <= && x >= && y <= && y >= && QP[x][y] == player) //位置合理 落子合理
Oper[(n + x_dir[i]) * + m + y_dir[i]] = true,flag = true;
}
}
return flag;
}
void dealAllOP(int n, int m)
{
int x, y;
for (int i = ; i < ; i++)
{
x = n + x_dir[i], y = m + y_dir[i];
if (x >= && x <= && y >= && y <= && QP[x][y] == OP)
{
while (QP[x][y] == OP&&x >= && x <= && y >= && y <= )
x += x_dir[i],y += y_dir[i];
if (x >= && x <= && y >= && y <= && QP[x][y] == player) //对面也是自己棋子,成功夹住,可以吞噬
{
x = n + x_dir[i], y = m + y_dir[i];
while (x >= && x <= && y >= && y <= && QP[x][y] != '-')
QP[x][y] = player,x += x_dir[i],y += y_dir[i];
}
}
}
}
bool judgeRunPlayer()
{
bool flag = false;
memset(Oper, false, sizeof(Oper));
for (int i = ; i <= N; i++)
{
for (int j = ; j <= N; j++)
if (QP[i][j] == OP) //判断四周是否可以落子
if (judgePlayAtSite(i, j)) flag = true;
}
if (flag == false) ExchangePlayer();
return flag;
}
void dealCommand()
{
char comm;
int x, y, temp;
while ()
{
scanf("%c", &comm);
switch (comm)
{
case 'M': //落子
scanf("%d", &temp);
x = temp / , y = temp % ;
QP[x][y] = player;
dealAllOP(x, y);
ExchangePlayer();
printNumber(); //输出棋盘棋子数
break;
case 'L': //提示信息
if (judgeRunPlayer()) printDataOper();//打印数据
else printf("No legal move.\n");
break;
case 'Q': //退出游戏、打印棋盘
showQPInfo();
printf("\n");
getchar();
return;
}
getchar();
}
}
void main()
{
FILE* fp = freopen("data3.in", "r", stdin);
freopen("data3.out", "w", stdout);
int num;
scanf("%d", &num);
getchar();
while (num--)
{
getQPInfo();
dealCommand();
}
freopen("CON", "r", stdin);
freopen("CON", "w", stdout);
}

没必要看

算法习题---4-3黑白棋(UVa220)的更多相关文章

  1. 51nod 1368:黑白棋 二分图最大匹配

    1368 黑白棋 题目来源: TopCoder 基准时间限制:1 秒 空间限制:131072 KB 分值: 160 难度:6级算法题  收藏  取消关注 有一个N*M的棋盘(1<=N,M< ...

  2. 用Dart写的黑白棋游戏

    2013年11月,Dart语言1.0稳定版SDK发布,普天同庆.从此,网页编程不再纠结了. 在我看来,Dart语法简直就是C#的升级版,太像了.之所以喜欢Ruby的一个重要理由是支持mixin功能,而 ...

  3. [CareerCup] 8.8 Othello Game 黑白棋游戏

    8.8 Othello is played as follows: Each Othello piece is white on one side and black on the other. Wh ...

  4. 黑白棋游戏 (codevs 2743)题解

    [问题描述] 黑白棋游戏的棋盘由4×4方格阵列构成.棋盘的每一方格中放有1枚棋子,共有8枚白棋子和8枚黑棋子.这16枚棋子的每一种放置方案都构成一个游戏状态.在棋盘上拥有1条公共边的2个方格称为相邻方 ...

  5. bzoj 2281 [Sdoi2011]黑白棋(博弈+组合计数)

    黑白棋(game) [问题描述] 小A和小B又想到了一个新的游戏. 这个游戏是在一个1*n的棋盘上进行的,棋盘上有k个棋子,一半是黑色,一半是白色. 最左边是白色棋子,最右边是黑色棋子,相邻的棋子颜色 ...

  6. C#黑白棋制作~

    前些天自己复习一下C#语言 做了个黑白棋,望大家看一下,可能有些bug嘿嘿 链接如下 http://files.cnblogs.com/files/flyingjun/%E9%BB%91%E7%99% ...

  7. 【BZOJ2281】【博弈论+DP】 [Sdoi2011]黑白棋

    Description 黑白棋(game) [问题描述] 小A和小B又想到了一个新的游戏. 这个游戏是在一个1*n的棋盘上进行的,棋盘上有k个棋子,一半是黑色,一半是白色. 最左边是白色棋子,最右边是 ...

  8. [SDOI2011]黑白棋

    Description 小A和小B又想到了一个新的游戏. 这个游戏是在一个1*n的棋盘上进行的,棋盘上有k个棋子,一半是黑色,一半是白色. 最左边是白色棋子,最右边是黑色棋子,相邻的棋子颜色不同. 小 ...

  9. C++ 黑白棋AI minimax+alphabeta剪枝

    没事写着玩玩,通过debian上的黑白棋测试,搜了10层,打hard应该问题不大 #include <cstdio> #include <cstring> using name ...

  10. 【算法习题】数组中任意2个(3个)数的和为sum的组合

    题1.给定一个int数组,一个数sum,求数组中和为sum的任意2个数的组合 @Test public void test_find2() { int[] arr = { -1, 0, 2, 3, 4 ...

随机推荐

  1. 牛客练习赛6 C 手铐

    手铐 思路: 缩环+树形dp 代码: #pragma GCC optimize(2) #pragma GCC optimize(3) #pragma GCC optimize(4) #include& ...

  2. ASP.NET六大巨头——内置对象(2)

    前面讲了三个内置对象,后面来探究一下另外三个内置对象Session.Server和Cookie,Session对象就是服务器给客户端的一个编号:Server对象提供对服务器上的方法和属性的访问:coo ...

  3. vue2 自定义键盘事件

  4. [GraphQL] Set variable and default value & alias

    query($category:PetCategory=CAT, $status:PetStatus=AVAILABLE) { #availablePets is the alias availabl ...

  5. BigDecimal计算

    货币金额的计算 - Java中的BigDecimal   在<Effective Java>这本书中也提到这个原则,float和double只能用来做科学计算或者是工程计算,在商业计算中我 ...

  6. jq time 控件

    当有时需要调用到添加时间是 就会用到时间控件 My97DatePicker是一款非常灵活好用的日期控件.使用非常简单. My97DatePicker使用方法 1.下载My97DatePicker组件包 ...

  7. 使用Python+selenium实现第一个自动化测试脚本

    原blog 一,安装Python. python官方下载地址:https://www.python.org/downloads/ 安装后点击开始菜单,在菜单最上面能找到IDLE. IDLE是pytho ...

  8. 2019-2020 ICPC, NERC, Southern and Volga Russian Regional Contest

    目录 Contest Info Solutions A. Berstagram B. The Feast and the Bus C. Trip to Saint Petersburg E. The ...

  9. P2637 第一次,第二次,成交!

    题目描述 因为奶牛们的节食运动(奶牛还节食?)给农夫JOHN余下了一大批干草无法处理,所以他准备要开一个拍卖会去出售他的干草.他有N(1<=N<=1000)批干草(每批大约100捆).他的 ...

  10. 10-5使用OpenType字体

    http://www.missyuan.com/viewthread.php?tid=350835&extra=&page=1 现在当我们通过Photoshop.Word或其他应用程序 ...