小明的遊戲就是玩棋盤???和這道題有啥區別啊。。如果不加多組測試資料,這道題可能還沒那道題難。好了,吐槽結束
首先還是按照比較常規的思路來想,上下左右都已經寫出來了,dfs和bfs沒得跑,蒟蒻不太會處理bfs,因為實在沒有想出來怎麼寫,所以第一次我寫的是dfs+記憶化搜尋,水了60分,因為dfs本來就慢,還有多組資料,剩下兩個點超時,所以應該換一種思路
#includeusing namespace std;
int n,m;
char aa[10005];
int a[1005][1005];
int mx[4]= ;
int my[4]= ; //上下左右移動
int f[1005][1005]; //記憶化搜尋
int bx,by,ex,ey; //起點終點
bool v[1005][1005]; //是否走過
inline void dfs(int x,int y,int sum)
}//建造乙個初始的矩陣
scanf("%d%d%d%d",&bx,&by,&ex,&ey);
bx++,by++,ex++,ey++;//從1開始處理更加方便
v[bx][by]=true;
dfs(bx,by,0); //搜尋
printf("%d\n",f[ex][ey]);
} return 0;
}
我選擇開啟了演算法標籤->最短路。但是我們學過的最短路都是在很多點直接跑,而這是乙個矩陣,不好處理,所以我們可以想辦法把這乙個矩陣拉成一條鏈或是平時我們學過的圖形結構處理
其實我們可以畫乙個圖來理解這個東西,其實還是很簡單的,我這裡把公式也寫出來,\(id=(x-1)*m+y\),當然如果你想寫成一些類似的算式那當然也可以
把點處理之後我們就要開始考慮邊權的問題了,對於乙個點,我們還是對周圍的上下左右四個點進行建邊,而對於異或,它是很美妙的,相同為1,不同為0,所以這道題剛好就可以利用這個性質建邊,就可以了,那麼剩下的就是常規跑最短路
但是這裡感覺是有乙個坑的,我自己沒想出來為什麼,我最開始用dijkstra寫的,這裡也不會有負邊的情況,但是跑炸了,可能是一些細節錯誤,然後我就改成spfa了
#includeusing namespace std;
const int maxn=20000005;
int n,m;
struct node e[maxn];
int head[250005],tot;
void add(int x,int y,int z) //鏈式前向星建邊
int d[250005]; //最短路答案
bool v[250005]; //是否入隊
int a[505][505]; //用來儲存圖
char aa[505]; //輸入
int bx,by,ex,ey; //起點,終點
void spfa(int s)
d[s]=0;
v[s]=true;
q.push(s);
while(!q.empty())
}} }
}//正常的spfa
int main()
} for(register int i=1; i<=n; i++) //建邊,因為從1開始容易處理一些,所以這裡所有的座標都要+1再處理,記得判斷邊界
} scanf("%d%d%d%d",&bx,&by,&ex,&ey);
bx++,by++,ex++,ey++;
int be=(bx-1)*m+by;
int en=(ex-1)*m+ey;
spfa(be);
printf("%d\n",d[en]);
} return 0;
}
P4554 小明的遊戲
每個點向它旁邊的點連邊,相同dis為0,不同為1。n 3,m 3每個點的標號如下 1 2 3 4 5 6 7 8 9 這樣安排標號唯一,標號計算公式 i 1 m j 連邊時判斷一下邊界,因為題目預設座標是從 0,0 開始,所以方便做題,將讀入的起點和終點座標都加1。然後跑個最短路就可以了 inclu...
P4554 小明的遊戲 洛谷 雙端佇列BFS
最近沒有更新部落格,全是因為英語,英語太難了qwq 洛谷春令營的作業我也不會 我是弱雞 隨機跳了2個題,難度不高,還是講講吧,學學新演算法也好 可以拿來水部落格 第一題就是這個小明的遊戲 小明最近喜歡玩乙個遊戲。給定乙個 n m的棋盤,上面有兩種格仔 和 遊戲的規則很簡單 給定乙個起始位置和乙個目標...
4554 叛逆的小明
problem description 叛逆期的小明什麼都喜歡反著做,連看數字也是如此 負號除外 比如 小明會把1234它看成4321 把 1234看成 4321 把230看成032 032 32 把 230看成 032 032 32 現在,小明做了一些a b和a b的題目 a,b為整數且不含前導0...