逆向暴力求解 538.D Weird Chess

11.12.2018

逆向暴力求解 538.D Weird Chess

New Point:

没有读好题

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

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

 

输出还搞错了~

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

 

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

 

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

 

要加强练习!

Describe:

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

Solution:

我的思路:扫数据的时候记录好多个棋子的位置,然后遍历输出的数组,记录dx,dy,再对应到输入的图中去判断是否可行,可行就标记’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所以最多是2500个’o’的地址

 

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

 

要加强练习!

Describe:

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

Solution:

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

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

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

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

·图中’.’不能被访问

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

 

11.13补充

判断可行

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

判断不可行

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

 

认真读题

 

Code:
posted @ 2018-11-13 10:31  Butterflier  阅读(228)  评论(0)    收藏  举报