1. 程式人生 > >移動玩具

移動玩具

題目 color ans clas bsp ret 交換 距離 一個bug

這裏是題目呀

題意: 給定初始矩陣和目標矩陣 (都是4*4,矩陣元素都為0/1)

只有相鄰才能交換

求最少交換多少次使得初始矩陣變為目標矩陣

思路:矩陣裏 一定有x個需交換成1的0

也一定有y個需交換成0的1

對於每一個需交換的元素來說

選取最近的與自己不同的待交換的元素交換即可

bfs實現

還有 要知道的很重要

調換兩個元素所需交換的次數為兩者的曼哈頓距離(即橫坐標之差加上縱坐標之差)

還有啊 這個算法有一個bug 待更正!!!!!!

現在只能先上有bug的code啦

技術分享圖片
 1 #include<iostream>
 2 #include<cstdio>
 3
#include<string> 4 #include<cstring> 5 #include<queue> 6 #include<cmath> 7 #define go(i,a,b) for(register int i=a;i<=b;i++) 8 #define mem(a,b) memset(a,b,sizeof(a)); 9 using namespace std; 10 int fmap[5][5],lmap[5][5],ans; 11 bool flag[5][5],vis[5][5]; 12 int dx[4]={1
,-1,0,0},dy[4]={0,0,1,-1}; 13 string s; 14 struct node {int x,y;}; 15 int bfs(int x,int y) 16 { 17 flag[x][y]=0; 18 queue<node> Q; 19 Q.push((node){x,y}); 20 while(!Q.empty()){ 21 node q=Q.front();Q.pop(); 22 go(i,0,3){ 23 int a=q.x+dx[i],b=q.y+dy[i]; 24 if(a<1||a>4||b<1||b>4||vis[a][b]) continue ; 25 if(flag[a][b]&&lmap[x][y]!=lmap[a][b]) 26 {flag[a][b]=0;return abs(a-x)+abs(b-y);} 27 else {vis[a][b]=1;Q.push((node){a,b});} 28 } 29 } 30 } 31 int main() 32 { 33 34 go(i,1,4){ 35 cin>>s; 36 go(j,1,4) fmap[i][j]=s[j-1]-0; 37 } 38 go(i,1,4){ 39 cin>>s; 40 go(j,1,4) lmap[i][j]=s[j-1]-0; 41 } 42 43 go(i,1,4) go(j,1,4) if(fmap[i][j]!=lmap[i][j]) flag[i][j]=1; 44 go(i,1,4) go(j,1,4) if(flag[i][j]) ans+=bfs(i,j),mem(vis,0); 45 printf("%d",ans); 46 return 0; 47 }
View Code

移動玩具