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 "); 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所以最多是2500个’o’的地址
中间的选择代码逻辑有些混乱
要加强练习!
Describe:
定义新的下棋游戏,给你多个棋子’o’和多个走向’x’,如果走向’x’和’o’重合显示’o’,问你能不能求出一个棋子的走动规则,并用2n-1 * 2n-1的图像表示出来
Solution:
我的思路:扫数据的时候记录好多个棋子的位置,然后遍历输出的数组,记录dx,dy,再对应到输入的图中去判断是否可行,可行就标记’x’不可行就标记’.’,略过中间点’o’,;
对于没有解决方案的情况:没有读好题
·原图中每个’x’必须且只能被访问一次
·原图中源点可以被访问多次不受限制
·图中’.’不能被访问
所以遍历输出数组后判断’x’对应的vis数组访问情况
11.13补充
判断可行
就是先扫一遍只要到达的点不是’.’就可行,越界也没问题
判断不可行
原图中若有’x’没有被轰炸过则方案不可行
认真读题