一開始被輸出-1給困住了,因為除了 .> <這樣以外 還可以剛好形成一個圈,這樣不太好判,而且不太敢寫dfs因為 圖是 2000 * 2000的有點大,反向的DFS也沒想到,沒法子也只能記憶化搜索一下,設dis[i][j]代表 由 (i,j)作為 起點能走的最遠步數,這樣覺得時間上應該能過去,然后枚舉每一個點作為起點 進行深搜,這里就能判斷是否為-1的情況,因為圖為 2000 * 2000的,所以最多讓你走 4000000步數,兩個棋子一前一后跟著走的話 那么最多不會超過8000000,所以可以設置一個最大值MAXN = 8000000,一旦 重新走了標記過的也就是路過的點 就返回這個值,就能判定是否為-1,
求出每個點作為起點的最大步數以后,開始尋找,若有兩個點的最大步數相同,而且他們在走的過程中沒有相碰,這樣最大步數和 就是 ans + ans ,若找不到的話 一前一后放置兩個棋子肯定就是最優得了 也就是 ans + ans - 1,好了就是代碼的 實現了,深搜寫的有點搓,
const int MAXN = 8000000 + 55;char aa[2000 + 55][2000 + 55];int mp[2000 + 55][2000 + 55];int xx[5] = {-1,1,0,0};int yy[5] = {0,0,-1,1};int dis[2000 + 55][2000 + 55];bool vis[2000 + 55][2000 + 55];int bb[2000 + 55][2000 + 55];int n,m;int ans;void init() { memset(aa,0,sizeof(aa)); memset(mp,0,sizeof(mp)); memset(dis,-1,sizeof(dis)); memset(vis,0,sizeof(vis)); memset(bb,-1,sizeof(bb));}bool input() { while(scanf("%d %d",&n,&m) == 2) { for(int i=0;i')mp[i][j] = 3; } } return false; } return true;}bool isok(int x,int y) { if(x <0 || x >=n || y < 0 || y >= m)return true; return false;}int dfs1(int x,int y) { if(isok(x,y))return 0; if(vis[x][y])return MAXN; if(dis[x][y] != -1) return dis[x][y]; vis[x][y] = 1; if(mp[x][y] == -1) { vis[x][y] = 0; dis[x][y] = 0; return 0; } else { int tmp = dfs1(x + xx[mp[x][y]],y + yy[mp[x][y]]) + 1; vis[x][y] = 0; dis[x][y] = tmp; return tmp; }}int dfs2(int x,int y,int cnt) { if(bb[x][y] != -1) { if(bb[x][y] == cnt && mp[x][y] != -1)return 0; return 1; } if(mp[x][y] == -1) { bb[x][y] = cnt; return 1; } else { bb[x][y] = cnt; return dfs2(x + xx[mp[x][y]],y + yy[mp[x][y]],cnt + 1); }}void cal() { ans = 0; int mark; for(int i=0;i = MAXN){ans = MAXN;return;} ans = max(ans,tmp); } } if(ans == 0)return ; mark = 0; for(int i=0;i 1){ans *= 2;return ;} } } } ans += (ans - 1);}void output() { if(ans >= MAXN)puts("-1"); else cout< 聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com