HDU--1195--bfs--Open the Lock
/* Name: HDU--1195--Open the Lock Author: shen_渊 Date: 17/04/17 08:54 Description: bfs,用四维数组标记状态,每位数字可以做三种操作 +1,-1,交换 可以不用优先队列,题意决定,优先队列更费时间 */ #include<iostream> #include<queue> #include<cstring> using namespace std; struct node{ int steps; string s; node():steps(0){ }; bool operator <(const node &a)const{ return steps>a.steps; } }; int bfs(); int vis[10][10][10][10]; string str1,str2; int main() { ios::sync_with_stdio(false); // freopen("in.txt","r",stdin); int n;cin>>n; while(n--){ memset(vis,0,sizeof(vis)); cin>>str1>>str2; if(str1 == str2)cout<<"0\n"; else cout<<bfs()<<endl; } return 0; } int bfs(){ priority_queue<node> q; node p; p.s = str1; q.push(p); vis[p.s[0]-'0'][p.s[1]-'0'][p.s[2]-'0'][p.s[3]-'0'] = 1; while(!q.empty()){ node a,temp; temp = q.top();q.pop(); if(temp.s == str2)return temp.steps; for(int i=0; i<4; ++i) { //+1 a.s = temp.s; if(a.s[i] == '9')a.s[i] = '1'; else a.s[i] += 1; if(!vis[a.s[0]-'0'][a.s[1]-'0'][a.s[2]-'0'][a.s[3]-'0']){ a.steps = temp.steps + 1; q.push(a); vis[a.s[0]-'0'][a.s[1]-'0'][a.s[2]-'0'][a.s[3]-'0'] = 1; } //-1 a.s = temp.s; if(a.s[i] == '1')a.s[i] = '9'; else a.s[i] -= 1; if(!vis[a.s[0]-'0'][a.s[1]-'0'][a.s[2]-'0'][a.s[3]-'0']){ a.steps = temp.steps + 1; q.push(a); vis[a.s[0]-'0'][a.s[1]-'0'][a.s[2]-'0'][a.s[3]-'0'] = 1; } //交换 if(i<3){ a.s = temp.s; a.s[i] = temp.s[i+1]; a.s[i+1] = temp.s[i]; if(!vis[a.s[0]-'0'][a.s[1]-'0'][a.s[2]-'0'][a.s[3]-'0']){ a.steps = temp.steps + 1; q.push(a); vis[a.s[0]-'0'][a.s[1]-'0'][a.s[2]-'0'][a.s[3]-'0'] = 1; } } } } return 0; }