题目描述
就是五子棋的规则,棋盘15*15;需要判断第几步谁赢了,或者是平局
样例
输入
9
1 1
2 1
1 2
2 2
1 3
2 3
1 4
2 4
1 5
输出:
A 9
算法1
是按照n子棋的思路做的,比较普适,感觉有点做模拟题的味道,判断的时候有点复杂了.
C++ 代码
#include <iostream>
#include<vector>
using namespace std;
#define line 15
#define max 5
//新建棋盘
int board[line][line] = {0};
int vitory = 0;
void drop(vector<int> &cur,int flag){
int tmp0=cur[0]-1,tmp1=cur[1]-1;
board[cur[0]][cur[1]]=flag;
//检查行
int num=0;
for(int i=cur[1];i<line;i++){
if(board[cur[0]][i]==flag){
num++;
}else break;
}
for(int i=cur[1];i>=0;i--){
if(board[cur[0]][i]==flag){
num++;
}else break;
}
num--;
if(num>=max){
vitory = flag;
return;
}
//检查列
num = 0;
for(int i=cur[0];i<line;i++){
if(board[i][cur[1]]==flag){
num++;
}else break;
}
for(int i=cur[0];i>=0;i--){
if(board[i][cur[1]]==flag){
num++;
}else break;
}
num--;
if(num>=max){
vitory = flag;
return;
}
// //检查左下右上
num = 0;
for(int i=cur[0],j=cur[1];i<line&&j<line;i++,j++){
if(board[i][j]==flag){
num++;
}else break;
}
for(int i=cur[0],j=cur[1];i>=0&&j>=0;i--,j--){
if(board[i][j]==flag){
num++;
}else break;
}
num--;
if(num>=max){
vitory = flag;
return;
}
//检查左上右下
num = 0;
for(int i=cur[0],j=cur[1];i<line&&j>=0;i++,j--){
if(board[i][j]==flag){
num++;
}else break;
}
for(int i=cur[0],j=cur[1];i>=0&&j<line;i--,j++){
if(board[i][j]==flag){
num++;
}else break;
}
num--;
if(num>=max){
vitory = flag;
return;
}
}
int main()
{
vector<vector<int>>v;
int num;
scanf("%d",&num);
for(int i=0;i<num;i++){
vector<int>tmp;
int a,b;
scanf("%d",&a);
scanf("%d",&b);
tmp.push_back(a-1);
tmp.push_back(b-1);
v.push_back(tmp);
}
int flag = 1;
int step = 1;
for (int i=0;i<v.size();i++){
drop(v[i],flag);
flag = -1*flag;
if(vitory == 1){
cout<<"A";cout<<" ";cout<<step;return 0;
}else if(vitory == -1){
cout<<"B";cout<<" ";cout<<step;return 0;
}
step++;
}
cout<<"Tie";
return 0;
}