题意:
给你一个5X5的图,棋盘上骑士的走法自己去百度,问能不能在10步内走到目标图,
解题思路:
从目标图开始往前走10步,保存所有能走到的图,然后输入,查找是否存在这个图,存在就是可以走到,不存在,走不到
使用map集合保存状态图,优先队列对状态重排序
#include <iostream> #include <stdio.h> #include <string> #include <map> #include <queue> using namespace std; struct Dir { int x, y; }; struct Node { int x,y; string str; int step; bool operator () (const Node& n1,const Node& n2)const { return n1.step>n2.step; } }; //使用优先队列对状态重排序 priority_queue<Node, vector<Node>, Node> q; Dir dir[] = { { +1, -2 }, { +2, +1 }, { +2, -1 }, { -1, +2 }, { -2, +1 }, { -2, -1 }, { -1, -2 }, { +1, +2 } }; map<string, int> maps; const int N=5; string nextStr(int cr, int cc, int r, int c, string cur) { string str(cur); char curc = cur[cr * N + cc]; char nextc = cur[r * N + c]; str[cr * N + cc] = nextc; str[r * N + c] = curc; return str; } void bfs() { while(q.empty()==false) { Node n = q.top(); q.pop(); string cur = n.str; int depth = n.step; int cr = n.x; int cc = n.y; //已经到10步 if(depth==10) return; for(int i = 0; i < 8; i++) { //nx row int r = dir[i].x + cr; //col int c = dir[i].y + cc; if(r < 0 || c < 0 || r >= N || c >= N) continue; string str=nextStr(cr, cc, r, c, cur); if(maps.find(str)!=maps.end()) continue; maps[str] = depth+1; Node nNode; nNode.x=r; nNode.y=c; nNode.step=depth+1; nNode.str=str; q.push(nNode); } } } int main() { freopen("d://1.text", "r", stdin); //5x5图 //目标图 string aim = "11111" "01111" "00 11" "00001" "00000"; Node iNode; iNode.step=0; iNode.str = aim; iNode.x = 2; iNode.y = 2; q.push(iNode); maps[aim] = 0; bfs(); int total; cin >> total; getchar(); while (total--) { string str = ""; string inStr = ""; for(int i = 0; i < 5; i++) { getline(cin, inStr); str += inStr; } map<string, int>::iterator s; int ok = 0; for(s = maps.begin(); s != maps.end(); ++s) { if(s->first == str) { ok=1; cout<<"Solvable in "<<s->second<<" move(s)."<<endl; break; } } if(!ok) cout<<"Unsolvable in less than 11 move(s)."<<endl; } return 0; }