当前位置 博文首页 > standard_input的博客:C. Tic-tac-toe
?传送门
翻译:
?时间限制1秒钟;
?内存限制64mb;?
标准输入输出;
可以肯定,每个人都对三连棋(井字棋)非常熟悉。它的规则的确非常简单。两个玩家轮流在3×3网格棋盘标记(一个玩家总是画×,另一个画0)那个玩家的三个标记先都在水平线上、垂直线上或对角线上连成一条线那个玩家就获胜了,然后游戏就结束了。如果棋盘满了,但画×的还是画0的都没赢,那一局就平局了。
首先你要输入一个3×3的棋局,每个单元网格都是空的,或有些X或0占用,你必须找出轮到那个玩家(第一或第二)下了,或输出下面的判决之一。
illegal(非法的) ?—— ?如果给定的棋盘不会在游戏中出现。
the first player won(玩家一获胜) ?—— ?给定的棋局刚好玩家一获胜。
the second player won(玩家二获胜) ?—— ?给定的棋局刚好玩家二获胜。
draw(平局) ?—— ?如果给定的棋局刚好是一个平局。
输入
由三行组成,每行包括“.”“X”“0”(每个格只能有一个大写字母“X”,或有一个数字0)。
输出
输出六个判决中的一个: first, second, illegal, the first player won, the second player won 或 draw。
样例
输入
X0X
.0.
.X.
输出
second
就是判断横,竖,斜对角有没有三个连在一起同样的就获胜。重点想好不合格的状态。先手的获胜要比后手多一步,后手获胜的话要和先手步数一样等等。一个简单模拟题。
c++AC代码:
?
#include<bits/stdc++.h>
using namespace std;
string grid[3];
bool win(char x){
for(int i=0;i<3;i++){
if(grid[0][i]==grid[1][i]&&grid[1][i]==grid[2][i]&&grid[1][i]==x)
return true;
if(grid[i][0]==grid[i][1]&&grid[i][1]==grid[i][2]&&grid[i][1]==x)
return true;
}
if(grid[0][0]==grid[1][1]&&grid[1][1]==grid[2][2]&&grid[1][1]==x)
return true;
if(grid[0][2]==grid[1][1]&&grid[1][1]==grid[2][0]&&grid[1][1]==x)
return true;
return false;
}
void dead(){
cout<<"illegal";
exit(0);
}
int main(){
for(int i=0;i<3;i++){
cin>>grid[i];
}
int c1=0,c2=0;
for(int i=0;i<3;i++){
for(int j=0;j<3;j++){
if(grid[i][j]=='X'){
c1++;
}
else if(grid[i][j]=='0'){
c2++;
}
}
}
if(c1-c2>=2){
dead();
}
else if(c2>c1){
dead();
}
else if(win('X')&&c1==c2){
dead();
}
else if(win('0')&&c1==c2+1){
dead();
}
else if(win('X')&&win('0')){
dead();
}
else if(win('X')){
cout<<"the first player won";
return 0;
}
else if(win('0')){
cout<<"the second player won";
return 0;
}
else if(c1+c2==9){
cout<<"draw"<<endl;
return 0;
}
else if(c1==c2+1){
cout<<"second"<<endl;
return 0;
}
else
cout<<"first"<<endl;
return 0;
}
?
cs