逆向暴力求解 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\n");
 95         for(int i = 0;i < len;++i)
 96         {
 97             printf("%s\n",outmp[i]);
 98         }
 99     }
100     else
101         printf("NO\n");
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
posted @ 2018-11-13 10:31  Butterflier  阅读(175)  评论(0编辑  收藏  举报