B. 发愿者的客厅
内存限制:256 MiB时间限制:1000 ms标准输入输出
题目类型:传统评测方式:文本比较
题目描述
-----因为"我已触摸过天空",所以我仍继续飞翔
在暑假里,37Lament 游玩了一款名为《Remnant 2》的游戏,在游戏的一个关卡中,你需要在 发愿者的客厅与一名NPC进行下棋游戏,当你取得了胜利,你才能前往下一个副本。
这个游戏的规则与井字棋十分的相似,当一方的三颗棋子在一条直线上时(横着,竖着,斜着),此方将获得胜利。而每一次操作棋子,只能向没有棋子的位置沿着实线移动一格。
例:
在这个图里,你执白棋,箭头指向的位置为你本次操作的所有选择,但你仅能选择一种

而当出现以下情况,为白棋获胜(在斜线方向三个棋子存在一个方向)

现在,你将执白棋,给定你当前的棋盘,你需要将任意一个白棋移动一个 位置。在移动过后,白棋是获胜 ,平局 ,还是黑棋在白棋获胜之前获胜?
输入格式
输入第一行包含整数 T,表示测试数据组数。
对于每一组测试数据,输入一个3x3 的矩阵表示当前的棋局情况,W 表示白棋所在的位置,B 表示黑棋所在的位置,而 . 表示没有棋子所在的空位。
输出格式
对于每一组测试数据,如果在移动过后白棋能够获胜输出Win! ,如果两方都没有获胜,输出Draw ,但如果黑棋在白棋获胜之前获胜,输出Lose
样例
样例输入
2
W.W
.B.
BBW
WW.
B.W
.BB
样例输出
Draw
Win!
数据范围与提示
T(1 ≤ T ≤ 10) 给出的棋局都是白棋未能获胜的棋局
用一个函数 check(char c) 表示整个地图字符 c 是否赢了
首先就看看 check('B'),看看黑色点是否已经赢了,如果已经赢了输出 Lose
我们枚举所有白色的操作,如果其中有一种操作可以赢那就输出 Win!
都没输出的话,就是平局,输出Draw
trick: 用一个数组 表示八个方向的下标变化情况,这样就可以一个循环枚举往哪走了
cpp
#include<bits/stdc++.h>
using namespace std;
int t,nx,ny,wx[5],wy[5],w;
int dx[8]={-1,-1,-1,0,0,1,1,1};
int dy[8]={-1,0,1,-1,1,-1,0,1};
char mp[4][4];
bool fg;
bool check(char tr)
{
for(int i=1;i<=3;i++)
{
if(mp[i][1]==tr&&mp[i][2]==tr&&mp[i][3]==tr)
return true;
if(mp[1][i]==tr&&mp[2][i]==tr&&mp[3][i]==tr)
return true;
}
if(mp[1][1]==tr&&mp[2][2]==tr&&mp[3][3]==tr)
return true;
if(mp[1][3]==tr&&mp[2][2]==tr&&mp[3][1]==tr)
return true;
return false;
}
int main()
{
scanf("%d",&t);
for(int tt=1;tt<=t;tt++)
{
w=0;
fg=false;
for(int i=1;i<=3;i++)
scanf("%s",mp[i]+1);
if(check('B')==true)
{
printf("Lose\n");
continue;
}
for(int i=1;i<=3;i++)
for(int k=1;k<=3;k++)
if(mp[i][k]=='W')
for(int j=0;j<=7;j++)
{
nx=i+dx[j];
ny=k+dy[j];
if(nx>=1&&nx<=3&&ny>=1&&ny<=3&&mp[nx][ny]=='.')
{
swap(mp[i][k],mp[nx][ny]);
if(fg==false&&check('W')==true)
{
printf("Win!\n");
fg=true;
}
swap(mp[i][k],mp[nx][ny]);
}
}
if(fg==false)
printf("Draw\n");
}
return 0;
}
D. 萨斯噶joker!(easy version)
内存限制:256 MiB时间限制:1000 ms标准输入输出
题目类型:传统评测方式:文本比较
题目描述
ComistryMo 暑假打通了P5R 之后,意外获得了怪盗团的力量,穿越到了异世界。但是他没有进行二周目,给邪恶的大人们发出预告信,而是沉迷于大富翁。

但是他太菜了!以至于芳泽霞学妹必须给ComistryMo放牌! 作为团长,为了捍卫自己的威严,他决定与怪盗团成员玩数学游戏来取代大富翁。
他出的题目是这样的:给定一个正整数n,以及长度为n的无序排列p,定义操作 为交换任意位置的两个数,定义花费 为进行一次操作时交换的两个数的差的绝对值,定义代价为通过操作使得排列p变为严格递增的花费和,现在请求出最小代价。 但是ComistryMo不会做这个题目,因此他想请聪明的你们来帮助他,解决此题,维护团长的尊严!
输入格式
第一行包含一个整数n,表示排列p长度。
第二行给出n个数字,表示到 (1 <= <= n)。
输出格式
输出一行一个整数,表示最小代价
样例
样例输入
3
3 2 1
样例输出
2
数据范围与提示
排列长度n (1 <= n <= 6)