zoukankan      html  css  js  c++  java
  • UVA 141 The Spot Game 斑点游戏。。

     The Spot Game 

    The game of Spot is played on an NxN board as shown below for N = 4. During the game, alternate players may either place a black counter (spot) in an empty square or remove one from the board, thus producing a variety of patterns. If a board pattern (or its rotation by 90 degrees or 180 degrees) is repeated during a game, the player producing that pattern loses and the other player wins. The game terminates in a draw after 2N moves if no duplicate pattern is produced before then.

    Consider the following patterns:

     

    picture23

     

    If the first pattern had been produced earlier, then any of the following three patterns (plus one other not shown) would terminate the game, whereas the last one would not.

     

    Input and Output

    Input will consist of a series of games, each consisting of the size of the board, N (2 tex2html_wrap_inline180 N tex2html_wrap_inline180 50) followed, on separate lines, by 2N moves, whether they are all necessary or not. Each move will consist of the coordinates of a square (integers in the range 1..N) followed by a blank and a character `+' or `-' indicating the addition or removal of a spot respectively. You may assume that all moves are legal, that is there will never be an attempt to place a spot on an occupied square, nor to remove a non-existent spot. Input will be terminated by a zero (0).

     

    Output will consist of one line for each game indicating which player won and on which move, or that the game ended in a draw.

     

    Sample input

     

    2
    1 1 +
    2 2 +
    2 2 -
    1 2 +
    2
    1 1 +
    2 2 +
    1 2 +
    2 2 -
    0

     

    Sample output

     

    Player 2 wins on move 3
    Draw

    题意:给定一个n*n的棋盘, 然后玩家1和玩家2每人轮操作棋子(可以放一个棋子或者拿掉一个棋子)。进行n次。。。然后如果某一个玩家进行一次操作之后。棋盘出现之前出现过的局面,这另外一位玩家获得胜利。。如果放完没人胜利,输出Draw。 注意,棋盘是可以旋转的,看题目中前4副图,代表的都是相同的局面。。

    思路:放了棋子的点为1,没放的为0,把每个局面,,保存成一个字符串,,每次放完棋子之后。旋转4次。4种情况都插入到一个set。。如果一个玩家放完棋子后的局面。在set里面可以找到,则这个玩家失败,另一个玩家胜利。。

    #include <stdio.h>
    #include <string.h>
    #include <iostream>
    #include <set>
    using namespace std;
    
    int n;
    int map[55][55];
    char save[4][2555];
    int x, y;
    char c;
    set<string> adj;
    void sav()
    {
        memset(save, 0 , sizeof(save));
        int t;
        t = 0;
        for (int i = 1; i <= n; i ++)
    	for (int j = 1; j <= n; j ++)
    	{
    	    save[0][t ++] = map[i][j] + '0';
    	}
        save[0][t] = '';
        t = 0;
        for (int i = 1; i <= n; i ++)
    	for (int j = 1; j <= n; j ++)
    	{
    	    save[1][t ++] = map[j][n + 1 - i] + '0';
    	}
        save[1][t] = '';
        t = 0;
        for (int i = 1; i <= n; i ++)
    	for (int j = 1; j <= n; j ++)
    	{
    	    save[2][t ++] = map[n + 1 - i][n + 1 - j] + '0';
    	}
        save[2][t] = '';
        t = 0;
        for (int i = 1; i <= n; i ++)
    	for (int j = 1; j <= n; j ++)
    	{
    	    save[3][t ++] = map[n + 1 - j][i] + '0';
    	}
        save[3][t] = '';
    }
    int main()
    {
        while (~scanf("%d", &n) && n)
        {
    	int judge = 0;
    	int bu = 0;
    	memset(map, 0 , sizeof(map));
    	adj.clear();
    	for (int i = 0; i < 2 * n; i ++)
    	{
    	    scanf("%d%*c%d%*c%c%*c", &x, &y, &c);
    	    if (c == '+')
    		map[x][y] = 1;
    	    if (c == '-')
    		map[x][y] = 0;
    	    sav();
    	    for (int j = 0; j < 4; j ++)
    	    {
    		if (adj.find(save[j]) != adj.end())
    		{
    		    judge = 1;
    		    break;
    		}
    	    }
    	    for (int j = 0 ; j < 4; j ++)
    		adj.insert(save[j]);
    	    if (judge)
    	    {
    		if (bu == 0)
    		    bu = i + 1;
    	    }
    	}
    	if (judge)
    	{
    	    if (bu % 2)
    		printf("Player 2 wins on move %d
    ", bu);
    	    else
    		printf("Player 1 wins on move %d
    ", bu);
    	}
    	else
    	    printf("Draw
    ");
        }
        return 0;
    }


  • 相关阅读:
    C# 关键字 virtual、override和new的用法
    架构技术及架构要素总结【转】
    vue文件目录结构
    vue项目中,如何对static文件夹下的静态文件添加时间戳,以达到清除缓存
    webpack中关于require与import的区别
    vue 根据下拉框动态切换form的rule
    el-select 根据value查询其对应的label值
    web前端项目规范
    JavaScript 编码规范
    HTML 编码规范
  • 原文地址:https://www.cnblogs.com/jiangu66/p/3228536.html
Copyright © 2011-2022 走看看