逆向暴力求解 538.D Weird Chess

11.12.2018node

逆向暴力求解 538.D Weird Chess

New Point

沒有讀好題ios

越界的狀況沒法判斷,因此輸出任何一種就能夠數組

因此他給你的樣例輸出徹底是誤導ide

 

輸出還搞錯了~spa

輸出的舉證中間居然空格隔開每個字符,真的是不應錯,不然應該是1Acode

 

而後空間開小了,地圖空間卻是注意到了,可是你存取o的空間只有1000,而地圖大小最大是50*50因此最可能是2500o的地址orm

 

中間的選擇代碼邏輯有些混亂xml

 

要增強練習!blog

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
相關文章
相關標籤/搜索