11.12.2018node
逆向暴力求解 538.D Weird Chess
New Point:
沒有讀好題ios
越界的狀況沒法判斷,因此輸出任何一種就能夠數組
因此他給你的樣例輸出徹底是誤導ide
輸出還搞錯了~spa
輸出的舉證中間居然空格隔開每個字符,真的是不應錯,不然應該是1A吧code
而後空間開小了,地圖空間卻是注意到了,可是你存取’o’的空間只有1000,而地圖大小最大是50*50因此最可能是2500個’o’的地址orm
中間的選擇代碼邏輯有些混亂xml
要增強練習!blog
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
沒有讀好題
越界的狀況沒法判斷,因此輸出任何一種就能夠
因此他給你的樣例輸出徹底是誤導
輸出還搞錯了~
輸出的舉證中間居然空格隔開每個字符,真的是不應錯,不然應該是1A吧
而後空間開小了,地圖空間卻是注意到了,可是你存取’o’的空間只有1000,而地圖大小最大是50*50因此最可能是2500個’o’的地址
中間的選擇代碼邏輯有些混亂
要增強練習!
Describe:
定義新的下棋遊戲,給你多個棋子’o’和多個走向’x’,若是走向’x’和’o’重合顯示’o’,問你能不能求出一個棋子的走動規則,並用2n-1 * 2n-1的圖像表示出來
個人思路:掃數據的時候記錄好多個棋子的位置,而後遍歷輸出的數組,記錄dx,dy,再對應到輸入的圖中去判斷是否可行,可行就標記’x’不可行就標記’.’,略過中間點’o’,;
對於沒有解決方案的狀況:沒有讀好題
·原圖中每一個’x’必須且只能被訪問一次
·原圖中源點能夠被訪問屢次不受限制
·圖中’.’不能被訪問
因此遍歷輸出數組後判斷’x’對應的vis數組訪問狀況
11.13補充
判斷可行
就是先掃一遍只要到達的點不是’.’就可行,越界也沒問題
判斷不可行
原圖中如有’x’沒有被轟炸過則方案不可行
認真讀題