FZU Tic-Tac-Toe -.- FZU邀请赛 FZU 2283

Problem L Tic-Tac-Toe

Accept: 94    Submit: 184
Time Limit: 1000 mSec    Memory Limit : 262144 KB

 Problem Description

Kim likes to play Tic-Tac-Toe.

Given a current state, and now Kim is going to take his next move. Please tell Kim if he can win the game in next 2 moves if both player are clever enough.

Here “next 2 moves” means Kim’s 2 move. (Kim move,opponent move, Kim move, stop).

Game rules:

Tic-tac-toe (also known as noughts and crosses or Xs and Os) is a paper-and-pencil game for two players, X and O, who take turns marking the spaces in a 3×3 grid. The player who succeeds in placing three of their marks in a horizontal, vertical, or diagonal row wins the game.

 Input

First line contains an integer T (1 ≤ T ≤ 10), represents there are T test cases.

For each test case: Each test case contains three lines, each line three string(“o” or “x” or “.”)(All lower case letters.)

x means here is a x

o means here is a o

. means here is a blank place.

Next line a string (“o” or “x”) means Kim is (“o” or “x”) and he is going to take his next move.

 Output

For each test case:

If Kim can win in 2 steps, output “Kim win!”

Otherwise output “Cannot win!”

 Sample Input

3

. . .

. . .

. . .

o

o x o

o . x

x x o

x

o x .

. o .

. . x

o

 Sample Output

Cannot win!

Kim win!

Kim win!

九宫棋Kim先下两步之内是否可以胜利

题解下次贴

#include <iostream>
#include <stdio.h>
#include <algorithm>
#include <string.h>
#include <cmath>
using namespace std;
char map[4][4];
int s[4][4],t,sum,k,cnt;
bool judge(int x,int y){
    if((x+y)%2==1){//当此时这个格子的行列的和为奇数时
        cnt=0,sum=0; //cnt代表可能胜利的次数
        for(int i=1;i<=3;i++){
            sum+=s[i][y];
        }
        sum*=k;  //同是负数相乘为正数
        if(sum==2)  //空白数为2时代表可以
            return true;
        else if(sum==1)  //当sum和为1时,此时可能胜利
            cnt++;
        sum=0;  //注意,此时一定要重置sum,因为sum在这个函数的前面后面的含义不同
        for(int i=1;i<=3;i++){
            sum+=s[x][i];//计算此时画相同的符号的个数之和
        }
        sum*=k;
        if(sum==2)  //如果画相同符号的和为2,代表画下一个一定会胜利
            return true;
        else if(sum==1)  //如果此时画的相同的符合为1,代表可能胜利
            cnt++;
        if(cnt==2){  //当可能胜利的次数超过2时一定可以胜利
            return true;
        }
    }
    else {  //当此时这个各自的行列的和为偶数时
        cnt=0,sum=0;
        for(int i=1;i<=3;i++){
            sum+=s[i][y];
        }
        sum*=k;
        if(sum==2)
            return true;
        else if(sum==1)
            cnt++;
        sum=0;
        for(int i=1;i<=3;i++){
            sum+=s[x][i];
        }
        sum*=k;
        if(sum==2)
            return true;
        else if(sum==1)
            cnt++;
        sum=0;
        if(x==y){  //代表这个空白所在的地方在斜线上
            for(int i=1;i<=3;i++){
                sum+=s[i][i];
            }
            sum*=k;  

            if(sum==2)
                return true;
            else if(sum==1)
                cnt++;
        }
        else {
            for(int i=1;i<=3;i++){
                sum+=s[i][4-i];
            }
            sum*=k;  

            if(sum==2)
                return true;
            else if(sum==1)
                cnt++;
        }
        if(cnt>=2){
            return true;
        }
    }
    return false;
}  

int main(){
    char st;
    int flag;
    scanf("%d",&t);
    while(t--){
        flag=0;
        memset(s,0,sizeof(0));
        for(int i=1;i<=3;i++){
            for(int j=1;j<=3;j++){
                cin>>map[i][j];
                if(map[i][j]==‘.‘)  s[i][j]=0;
                else if(map[i][j]==‘o‘) s[i][j]=1;
                else if(map[i][j]==‘x‘) s[i][j]=-1;
            }
        }
        cin>>st;  //代表此时Kim所用的符号
        if(st==‘o‘) k=1;
        else if (st==‘x‘) k=-1;
        for(int i=1;i<=3;i++){
            for(int j=1;j<=3;j++){
                if(map[i][j]==‘.‘){
                    if(judge(i,j))
                        flag=1;
                }
            }
        }
        if(flag) puts("Kim win!");
            else    puts("Cannot win!");
    }
    return 0;
}  
时间: 2024-10-06 03:35:05

FZU Tic-Tac-Toe -.- FZU邀请赛 FZU 2283的相关文章

tic tac toe

井字棋 tic tac toe,布布扣,bubuko.com

amazon.设计1. tic tac toe

//不觉中 已经全力找工作好久好久了.大概有1年半了.身心疲惫,不要放弃.曙光快来了. 1.tic tac toe //http://www.ntu.edu.sg/home/ehchua/programming/java/JavaGame_TicTacToe.html 类似相关棋牌坐标对战游戏 一通百通 /** * Enumerations for the various states of the game */ public enum GameState { // to save as "G

Principle of Computing (Python)学习笔记(7) DFS Search + Tic Tac Toe use MiniMax Stratedy

1. Trees Tree is a recursive structure. 1.1 math nodes https://class.coursera.org/principlescomputing-001/wiki/view? page=trees 1.2 CODE无parent域的树 http://www.codeskulptor.org/#poc_tree.py class Tree: """ Recursive definition for trees plus

2019 GDUT Rating Contest III : Problem C. Team Tic Tac Toe

题面: C. Team Tic Tac Toe Input ?le: standard input Output ?le: standard output Time limit: 1 second Memory limit: 256 megabytes Farmer John owns 26 cows, which by happenstance all have names starting with different letters of the alphabet, so Farmer J

【leetcode】1275. Find Winner on a Tic Tac Toe Game

题目如下: Tic-tac-toe is played by two players A and B on a 3 x 3 grid. Here are the rules of Tic-Tac-Toe: Players take turns placing characters into empty squares (" "). The first player A always places "X" characters, while the second pl

Epic - Tic Tac Toe

N*N matrix is given with input red or black.You can move horizontally, vertically or diagonally. If 3 consecutive samecolor found, that color will get 1 point. So if 4 red are vertically then pointis 2. Find the winner. def tic_tac_toe(board,n) red,

Learn Python 015: Tic Tac Toe Game

board = [' ' for i in range(9)] def print_board(): row_1 = '|{}|{}|{}|'.format(board[0], board[1], board[2]) row_2 = '|{}|{}|{}|'.format(board[3], board[4], board[5]) row_3 = '|{}|{}|{}|'.format(board[6], board[7], board[8]) print('\n') print(row_1)

UVa 10363 - Tic Tac Toe

题目:给你一个井字棋的状态,判断是否合法. 分析:枚举.直接枚举多有情况判断即可. 合法状态有三种情况:(X先下子) 1.X赢,则O不能赢,且X比O多一子: 2.O赢,则X不能赢,且O和X子一样多: 3.没人赢,此时O的子和可能和X一样多,也可能少一个. 说明:简单题(⊙_⊙). #include <algorithm> #include <iostream> #include <cstdlib> #include <cstring> #include &l

[CareerCup] 17.2 Tic Tac Toe 井字棋游戏

17.2 Design an algorithm to figure out if someone has won a game oftic-tac-toe. 这道题让我们判断玩家是否能赢井字棋游戏,有下面几点需要考虑: 1. 判断是否能赢hasWon函数是调用一次还是多次,如果是多次,我们可能为了优化而需要加入一些预处理. 2. 井字棋游戏通常是3x3的大小,我们是否想要实现NxN的大小? 3. 我们需要在代码紧凑,执行速度和代码清晰之间做出选择. #include <iostream> #

ACM-Team Tic Tac Toe

我的代码: #include <bits/stdc++.h> using namespace std; int main() { char a[3][3]; int i,j=0; for(i=0;i<3;i++){ for(j=0;j<3;j++){ cin>>a[i][j]; } } int count1,count2; int len1,len2; len1=len2=0; char b[50],c[2][50]; count1=count2=0; for( i=0