• 逆向暴力求解 538.D Weird Chess


    11.12.2018

    逆向暴力求解 538.D Weird Chess

    New Point

    没有读好题

    越界的情况无法判断,所以输出任何一种就可以

    所以他给你的样例输出完全是误导

     

    输出还搞错了~

    输出的举证中间竟然空格隔开每一个字符,真的是不该错,否则应该是1A

     

    然后空间开小了,地图空间倒是注意到了,但是你存取o的空间只有1000,而地图大小最大是50*50所以最多是2500o的地址

     

    中间的选择代码逻辑有些混乱

     

    要加强练习!

    Describe:

    定义新的下棋游戏,给你多个棋子o和多个走向x,如果走向xo重合显示o,问你能不能求出一个棋子的走动规则,并用2n-1 * 2n-1的图像表示出来

    Solution:

    我的思路:扫数据的时候记录好多个棋子的位置,然后遍历输出的数组,记录dxdy,再对应到输入的图中去判断是否可行,可行就标记x不可行就标记.,略过中间点o,;

    对于没有解决方案的情况:没有读好题

    ·原图中每个x必须且只能被访问一次

    ·原图中源点可以被访问多次不受限制

    ·图中.不能被访问

    所以遍历输出数组后判断x对应的vis数组访问情况

     

    11.13补充

    判断可行

    就是先扫一遍只要到达的点不是.就可行,越界也没问题

    判断不可行

    原图中若有x没有被轰炸过则方案不可行

     

    认真读题

     

    Code
      1 #include <iostream>
      2 #include <cstdio>
      3 #include <cstring>
      4 using namespace std;
      5 const int maxn = 1e3;
      6 char mp[maxn][maxn];
      7 char outmp[maxn][maxn];
      8 int vis[maxn][maxn];
      9 struct node{
     10     int x,y;
     11 }sp[maxn*3];
     12 int cnt;
     13 void init()
     14 {
     15     memset(vis,0,sizeof(vis));
     16     cnt = 0;
     17 }
     18 int n;
     19 bool check(int dx,int dy)
     20 {
     21     int flag = 0;
     22     //int broke = 0;
     23     for(int i = 0;i < cnt;++i)
     24     {
     25         int nowx = sp[i].x;
     26         int nowy = sp[i].y;
     27         int nx = nowx + dx;
     28         int ny = nowy + dy;
     29         if(nx < 0 || nx>= n || ny < 0 || ny >= n)continue;
     30         if(mp[nx][ny] == '.')
     31         {
     32             return false;
     33         }
     34     }
     35     for(int i = 0;i < cnt;++i)
     36     {
     37         int nowx = sp[i].x;
     38         int nowy = sp[i].y;
     39         int nx = nowx + dx;
     40         int ny = nowy + dy;
     41         if(nx < 0 || nx>= n || ny < 0 || ny >= n)continue;
     42         if(mp[nx][ny] == 'x')
     43         {
     44             vis[nx][ny]++;
     45         }
     46     }
     47     return true;
     48 }
     49 int main()
     50 {
     51     scanf("%d",&n);
     52     init();
     53     for(int i = 0;i < n;i++)
     54     {
     55         scanf("%s",mp[i]);
     56         for(int j = 0;j < n;++j)
     57         {
     58             if(mp[i][j] == 'o')
     59             {
     60                 sp[cnt].x = i;
     61                 sp[cnt++].y = j;
     62             }
     63         }
     64     }
     65     int len = 2 * n - 1;
     66     int midx = n - 1,midy = n - 1;
     67     outmp[midx][midy] = 'o';
     68     for(int i = 0;i < len;++i)
     69     {
     70         for(int j = 0;j < len;++j)
     71         {
     72             if(i == midx && j == midy)continue;
     73             int dx = i - midx;
     74             int dy = j - midy;
     75             if(check(dx,dy))
     76                 outmp[i][j] = 'x';
     77             else
     78                 outmp[i][j] = '.';
     79         }
     80     }
     81     int flag = 1;
     82     for(int i = 0;i < n;++i)
     83     {
     84         for(int j = 0;j < n;++j)
     85         {
     86             if(mp[i][j] == 'x' && vis[i][j] == 0)
     87             {
     88                 flag = 0;
     89             }
     90         }
     91     }
     92     if(flag)
     93     {
     94         printf("YES
    ");
     95         for(int i = 0;i < len;++i)
     96         {
     97             printf("%s
    ",outmp[i]);
     98         }
     99     }
    100     else
    101         printf("NO
    ");
    102     return 0;
    103 }
     
     

     

     

    11.12.2018

    逆向暴力求解 538.D Weird Chess

    New Point

    没有读好题

    越界的情况无法判断,所以输出任何一种就可以

    所以他给你的样例输出完全是误导

     

    输出还搞错了~

    输出的举证中间竟然空格隔开每一个字符,真的是不该错,否则应该是1A

     

    然后空间开小了,地图空间倒是注意到了,但是你存取o的空间只有1000,而地图大小最大是50*50所以最多是2500o的地址

     

    中间的选择代码逻辑有些混乱

     

    要加强练习!

    Describe:

    定义新的下棋游戏,给你多个棋子o和多个走向x,如果走向xo重合显示o,问你能不能求出一个棋子的走动规则,并用2n-1 * 2n-1的图像表示出来

    Solution:

    我的思路:扫数据的时候记录好多个棋子的位置,然后遍历输出的数组,记录dxdy,再对应到输入的图中去判断是否可行,可行就标记x不可行就标记.,略过中间点o,;

    对于没有解决方案的情况:没有读好题

    ·原图中每个x必须且只能被访问一次

    ·原图中源点可以被访问多次不受限制

    ·图中.不能被访问

    所以遍历输出数组后判断x对应的vis数组访问情况

     

    11.13补充

    判断可行

    就是先扫一遍只要到达的点不是.就可行,越界也没问题

    判断不可行

    原图中若有x没有被轰炸过则方案不可行

     

    认真读题

     

    Code
  • 相关阅读:
    大数据笔记13:Hadoop安装之Hadoop的配置安装
    Android(java)学习笔记206:JNI之工具快速开发步骤
    Android(java)学习笔记205:JNI之编写jni程序适配所有处理器型号
    JS 实现Json查询方法
    js中call与apply用法
    大数运算(待续)
    HDU 2553(N皇后)(DFS)
    C++ STL:stack和queue
    快速幂取模(POJ 1995)
    位运算
  • 原文地址:https://www.cnblogs.com/DF-yimeng/p/9950884.html
Copyright © 2020-2023  润新知