ACM-Alice and Bob

Posted 小小小的程序媛

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ACM-Alice and Bob相关的知识,希望对你有一定的参考价值。

题目描述:Alice and Bob

One day, Alice asks Bob to play a game called “K-in-a-row”. There is a game board whose size is N*M. Alice plays first, and they alternate in placing a piece of their color on an empty intersection. The winner is the first player to get an unbroken row of K stones horizontally, vertically, or diagonally. Now given the last situation of the game board, I would like to know who win or just a draw?

输入

The first line of input is the number of test cases T.

For each test case. The first line contains three integers N(3<= N <=15), M(3<=M<=15) and K(3<=K<=6).The next N line, each line contains M pieces, ‘A’ means Alice’s place and ‘B’ means Bob’s place while ‘O’ means empty. It is promised that at most one player wins.

输出

For each test case output the answer on a single line, if Alice wins then print “Alice Win!”, if Bob wins then print ”Bob Win!”, if no one wins, then print ”No Win!”.

样例输入

2
6 6 6
AOOOOO
BABBOO
OOAOBO
OOOAOO
OOBOAO
OOOOOA
5 5 3
AOBOA
BABAO
OOBOO
OOOOO
OOOOO

样例输出

Alice Win!
Bob Win!


思路:就是个五子棋,DFS即可。但是我的代码没有A,找不到问题。所以附上我的代码和正确代码。

我的代码:
// Alice and Bob_K_win.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"


//备注:没有AC!

#include <iostream>
#include <cstring>
using namespace std;

const int MAX = 20;
int t, n, m, k,ans, vis[MAX][MAX],dir[8][2] = { 1, 0, -1, 0, 0, 1, 0, -1, 1, 1, -1, -1, 1, -1, -1, 1 };
char map[MAX][MAX];

void DFS(int x, int y,int a,int b)
{
    //cout << "x:" << x << "\ty:" << y << "\ta:" << a << "\tb:" << b << endl;

    if (ans != 0) return;

    if (a == k || b == k)
    {
        if (a == k) ans = 1;
        else ans = 2;
        return;
    }


    for (int i = 0; i < 8; i++)
    {
        int nx = x + dir[i][0];
        int ny = y + dir[i][1];
        if (nx >= 0 && nx < n && ny >= 0 && ny < m && !vis[nx][ny] && map[nx][ny] != O)
        {
            //cout << "nx:" << nx << "\tny:" << ny << "\tmap[nx][ny]:" << map[nx][ny] << endl;
            vis[nx][ny] = 1;
            if (map[nx][ny] == A) DFS(nx, ny, a + 1, b);
            else DFS(nx, ny, a, b + 1);
        }
    }


}


int main()
{
    cin >> t;
    while (t--)
    {
        memset(vis, 0, sizeof(vis));
        memset(map, \0, sizeof(map));
        ans = 0;

        cin >> n >> m >> k;
        for (int i = 0; i < n; i++)
            cin >> map[i];

        for (int i = 0; i < n; i++)
        {
            for (int j = 0; j < m; j++)
            {
                if (map[i][j] != O && !vis[i][j])
                {
                    vis[i][j] = 1;
                    if (map[i][j] == A) DFS(i, j, 1, 0);
                    else if (map[i][j] == B) DFS(i, j, 0, 1);
                }
                    
            }
        }

        if (ans == 1)
            cout << "Alice Win!" << endl;
        else if (ans == 2)
            cout << "Bob Win!" << endl;
        else
            cout << "No Win!" << endl;


    }

}

 

 

正确的代码:

#include<cstdio>
#include<iostream>
using namespace std;
int n,m,k,flag;
char map[20][20];
void dfs(int x,int y,int num,int dis,char e)
{
    if(num>k)
    {
        flag=1;
        if(e==A)
            cout<<"Alice Win!"<<endl;
        else
            cout<<"Bob Win!"<<endl;
        return ;
    }
    if(map[x][y]==e && x<n && x>=0 && y<m && y>=0)
    {
        switch(dis)
        {
        case 1: dfs(x,y+1,num+1,dis,e);break;
        case 2: dfs(x,y-1,num+1,dis,e);break;
        case 3: dfs(x+1,y,num+1,dis,e);break;
        case 4: dfs(x-1,y,num+1,dis,e);break;
        case 5: dfs(x+1,y+1,num+1,dis,e);break;
        case 6: dfs(x+1,y-1,num+1,dis,e);break;
        case 7: dfs(x-1,y-1,num+1,dis,e);break;
        case 8: dfs(x-1,y+1,num+1,dis,e);break;
        }
    }
}
void solve()
{
    flag=0;
    for(int i=0;i<n;i++)//A
    {
        for(int j=0;j<m;j++)
        {
            if(map[i][j]==A)
            {
                for(int k=1;k<=8;k++)
                    dfs(i,j,1,k,A);
            }
            if(flag)
                break;
        }
        if(flag)
            break;
    }
    if(!flag)
    {
        for(int i=0;i<n;i++)//B
        {
            for(int j=0;j<m;j++)
            {
                if(map[i][j]==B)
                {
                    for(int k=1;k<=8;k++)
                        dfs(i,j,1,k,B);
                }
                if(flag)
                    break;
            }
            if(flag)
                break;
        }    
    }    
    if(!flag)
        cout<<"No Win!"<<endl;
}
int main()
{
    int t;
    cin>>t;
    while(t--)
    {
        cin>>n>>m>>k;
        for(int i=0;i<n;i++)
        {
            for(int j=0;j<m;j++)
                cin>>map[i][j];
        }
        solve();
    }
    return 0;
}

 

以上是关于ACM-Alice and Bob的主要内容,如果未能解决你的问题,请参考以下文章

POJ 1704 Georgia and Bob

POJ 1704 Georgia and Bob(阶梯博弈+证明)

poj 1704 Georgia and Bob(阶梯博弈)

2021牛客暑期多校训练营1 - A - Alice and Bob - 题解

2021牛客暑期多校训练营1 - A - Alice and Bob - 题解

Alice and Bob