zoukankan      html  css  js  c++  java
  • Codeforces Round #300 D. Weird Chess 水题

    D. Weird Chess

    Time Limit: 1 Sec  Memory Limit: 256 MB

    题目连接

    http://codeforces.com/contest/538/problem/D

    Description

    Igor has been into chess for a long time and now he is sick of the game by the ordinary rules. He is going to think of new rules of the game and become world famous.

    Igor's chessboard is a square of size n × n cells. Igor decided that simple rules guarantee success, that's why his game will have only one type of pieces. Besides, all pieces in his game are of the same color. The possible moves of a piece are described by a set of shift vectors. The next passage contains a formal description of available moves.

    Let the rows of the board be numbered from top to bottom and the columns be numbered from left to right from 1 to n. Let's assign to each square a pair of integers (x, y) — the number of the corresponding column and row. Each of the possible moves of the piece is defined by a pair of integers (dx, dy); using this move, the piece moves from the field (x, y) to the field (x + dx, y + dy). You can perform the move if the cell (x + dx, y + dy) is within the boundaries of the board and doesn't contain another piece. Pieces that stand on the cells other than (x, y) and (x + dx, y + dy) are not important when considering the possibility of making the given move (for example, like when a knight moves in usual chess).

    Igor offers you to find out what moves his chess piece can make. He placed several pieces on the board and for each unoccupied square he told you whether it is attacked by any present piece (i.e. whether some of the pieces on the field can move to that cell). Restore a possible set of shift vectors of the piece, or else determine that Igor has made a mistake and such situation is impossible for any set of shift vectors.

    Input

    The first line contains a single integer n (1 ≤ n ≤ 50).

    The next n lines contain n characters each describing the position offered by Igor. The j-th character of the i-th string can have the following values:

    • o — in this case the field (i, j) is occupied by a piece and the field may or may not be attacked by some other piece;
    • x — in this case field (i, j) is attacked by some piece;
    • . — in this case field (i, j) isn't attacked by any piece.

    It is guaranteed that there is at least one piece on the board.


     

    Output

    If there is a valid set of moves, in the first line print a single word 'YES' (without the quotes). Next, print the description of the set of moves of a piece in the form of a (2n - 1) × (2n - 1) board, the center of the board has a piece and symbols 'x' mark cells that are attacked by it, in a format similar to the input. See examples of the output for a full understanding of the format. If there are several possible answers, print any of them.

    If a valid set of moves does not exist, print a single word 'NO'.

     

    Sample Input

    5
    oxxxx
    x...x
    x...x
    x...x
    xxxxo

    Sample Output

    YES
    ....x....
    ....x....
    ....x....
    ....x....
    xxxxoxxxx
    ....x....
    ....x....
    ....x....
    ....x....

    HINT

    题意

    给你一个棋盘,o代表旗子的位置,x代表能够攻击的地方,让你输出这个旗子的攻击范围

    题解:

    啊,这道题拿攻击范围去推前面的给你的棋盘,去检查是否每一个o都满足,用答案去推棋盘

    有这个逆向思维做这道题就好多了= =

    代码:

    //qscqesze
    #include <cstdio>
    #include <cmath>
    #include <cstring>
    #include <ctime>
    #include <iostream>
    #include <algorithm>
    #include <set>
    #include <vector>
    #include <sstream>
    #include <queue>
    #include <typeinfo>
    #include <fstream>
    #include <map>
    #include <stack>
    typedef long long ll;
    using namespace std;
    //freopen("D.in","r",stdin);
    //freopen("D.out","w",stdout);
    #define sspeed ios_base::sync_with_stdio(0);cin.tie(0)
    #define maxn 55
    #define mod 10007
    #define eps 1e-9
    int Num;
    char CH[20];
    //const int inf=0x7fffffff;   //нчоч╢С
    const int inf=0x3f3f3f3f;
    /*
    
    inline void P(int x)
    {
        Num=0;if(!x){putchar('0');puts("");return;}
        while(x>0)CH[++Num]=x%10,x/=10;
        while(Num)putchar(CH[Num--]+48);
        puts("");
    }
    */
    inline ll read()
    {
        int x=0,f=1;char ch=getchar();
        while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
        while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
        return x*f;
    }
    inline void P(int x)
    {
        Num=0;if(!x){putchar('0');puts("");return;}
        while(x>0)CH[++Num]=x%10,x/=10;
        while(Num)putchar(CH[Num--]+48);
        puts("");
    }
    //**************************************************************************************
    
    char s[100][100];
    
    int vis[1000][1000];
    int dp[1000][1000];
    int main()
    {
        int n=read();
        for(int i=1;i<=n;i++)
            scanf("%s",s[i]+1);
        for(int i=1;i<=n;i++)
        {
            for(int j=1;j<=n;j++)
            {
                if(s[i][j]=='o')
                {
                    for(int i1=1;i1<=n;i1++)
                    {
                        for(int j1=1;j1<=n;j1++)
                        {
                            if(s[i1][j1]=='.')
                                vis[n+i1-i][n+j1-j]=1;
                        }
                    }    
                }
            }
        }
        
        for(int i=1;i<=n;i++)
        {
            for(int j=1;j<=n;j++)
            {
                if(s[i][j]=='o')
                {
                    for(int i1=1;i1<=n;i1++)
                    {
                        for(int j1=1;j1<=n;j1++)
                        {
                            if(s[i1][j1]=='x'&&!vis[n+i1-i][n+j1-j])
                                dp[i1][j1]=1;
                        }
                    }    
                }
            }
        }
        
        for(int i=1;i<=n;i++)
        {
            for(int j=1;j<=n;j++)
            {
                if(s[i][j]=='x'&&dp[i][j]!=1)
                {
                    puts("NO");
                    return 0;
                }
            }
        }
        puts("YES");
        for(int i=1;i<=2*n-1;i++)
        {
            for(int j=1;j<=2*n-1;j++)
            {
                if(i==n&&j==n)
                    cout<<"o";
                else if(vis[i][j])
                    cout<<".";
                else
                    cout<<"x";
            }
            cout<<endl;
        }
    }
  • 相关阅读:
    JMeter工具基础知识篇-使用命令行生成html报告
    解决jmeter请求不成功或者报403错误
    jmeter之JDBC Request各种数据库配置
    Jmeter模拟不同带宽
    SQL语句大全
    Jmeter 吞吐量控制器的使用
    如何找出系统能承受的最大在线用户数
    Jmeter之函数的应用
    jmeter如何设置IP欺骗
    华为云分布式缓存服务DCS与开源服务差异对比
  • 原文地址:https://www.cnblogs.com/qscqesze/p/4458885.html
Copyright © 2011-2022 走看看