時限:5000ms 記憶體限制:20000k 總時限:10000ms
描述在九宮格裡放在1到8共8個數字還有乙個是空格,與空格相鄰的數字可以移動到空格的位置,問給定的狀態最少需要幾步能到達目標狀態(用0表示空格):
1 2 3
4 5 6
7 8 0
輸入輸入乙個給定的狀態。
輸出輸出到達目標狀態的最小步數。不能到達時輸出-1。
輸入樣例
1 2 3
4 0 6
7 5 8
輸出樣例2
#include
#include
#include
using namespace std;
queueq1;
mapstep;
int istate;
int dr[4]=;//0,1,2,3分別表示左,下,右,上
int dc[4]=;//0,1,2,3分別表示左,下,右,上
int bfs();
void readdate();
void init();
int canmoveto(int u,int dire);
int moveto(int u ,int dire);
int main()
int bfs()
if(step.count(v)==0)//如果v是乙個新狀態 }
}}return -1;
}void readdate()
}istate=num;
}void init()//1.起點加入佇列 2.標註起點是已到達過的節點3.記錄到達起點的最小步數為零
int canmoveto(int u,int dire)}}
r=brow+dr[dire];
c=bcol+dc[dire];
if(r<=2&&r>=0&&c<=2&&c>=0)
return 0;
}int moveto(int u,int dire)}}
r=brow+dr[dire];
c=bcol+dc[dire];
sa[brow][bcol]=sa[r][c];
sa[r][c]=0;
for(i=0;i<3;i++)
}return sum;
}
八數碼問題(廣搜)
題目 描述 在九宮格裡放在1到8共8個數字還有乙個是空格,與空格相鄰的數字可以移動到空格的位置,問給定的狀態最少需要幾步能到達目標狀態 用0表示空格 1 2 3 4 5 6 7 8 0 輸入 輸入乙個給定的狀態。輸出 輸出到達目標狀態的最小步數。不能到達時輸出 1。輸入樣例 1 2 3 4 0 6 ...
八數碼 廣搜)
時限 5000ms 記憶體限制 20000k 總時限 10000ms 描述在九宮格裡放在1到8共8個數字還有乙個是空格,與空格相鄰的數字可以移動到空格的位置,問給定的狀態最少需要幾步能到達目標狀態 用0表示空格 1 2 3 4 5 6 7 8 0 輸入輸入乙個給定的狀態。輸出輸出到達目標狀態的最小步...
雙向廣搜 八數碼
雙向廣搜還是乙個很神奇的東西 判重更神奇 雙廣僅適用於有目標狀態的題目 include include include include include include include include include include using namespace std const int maxx...