//input a[]; m,n; //final state final[] /* a[9]={0,1,2,3,5,4,6,7,8}; * final[9]={0,1,2,3,4,5,6,7,8} ********************************************* * @Author Lizhijie||onezeros *********************************************/ #include <vector> #include <iostream> using namespace std; struct MapInfo{ char a[9];//store current situation // int seltnum;//position in current path // int globnum;//prior position of this path in vector }; int final[9]={0,1,2,3,4,5,6,7,8}; int a[9]={0,1,2,3,5,4,6,7,8}; vector<MapInfo> mapInfo; // i :the current position // prior: lastest position bool go(int prior,int i) { int j; for(j=0;j<9;j++){//check wether it's the result if(mapInfo.a[j]!=final[j]) break; } if(j==9) return true; vector<MapInfo> ::iterator itera; for(itera=mapInfo.begin();itera<mapInfo.end()-1;itera++){ for(j=0;j<9;j++){//check wether current situation has happened if((*itera).a[j]!=mapInfo.back.a[j]) break; } if(j==9){ //because there is only one step after branch mapInfo.pop_back(); return false; } } MapInfo current[9]; for(j=0;j<9;j++){ current.a[j]=mapInfo.back.a[j]; } switch(i){ case 0: if(prior!=1&&prior!=3){ pushpath(current,0,1); go(0,1); pushpath(current,0,3); go(0,3); } break; case 1: if(prior!=0&&prior!=4&&prior!=2){ pushpath(current,1,0); go(1,0); pushpath(current,1,4); go(1,4); pushpath(current,1,2); go(1,2); } break; case 2: if(prior!=1&&prior!=5){ pushpath(current,2,1); go(2,1); pushpath(current,2,5); go(2,5); } break; case 3: if(prior!=0&&prior!=4&&prior!=6){ pushpath(current,3,0); go(3,0); pushpath(current,3,4); go(3,4); pushpath(current,3,6); go(3,6); } break; case 4: if(prior!=1&&prior!=3&&prior!=5&&prior!=7){ pushpath(current,4,1); go(4.1); pushpath(current,4,3); go(4,3); pushpath(current,4,5); go(4,5); pushpath(current,4,7): go(4,7); } break; case 5: if(prior!=2&&prior!=4&&prior!=8){ pushpath(current,5,2); go(5,2); pushpath(current,5,4); go(5,4); pushpath(current,5,8); go(5,8); } break; case 6: if(prior!=3&&prior!=7){ pushpath(current,6,3); go(6,3); pushpath(current,6,7); go(6,7); } break; case 7: if(prior!=6&&prior!=4&&prior!=8){ pushpath(current,7,4); go(7,4); pushpath(current,7,6); go(7,6); pushpath(current,7,8); go(7,8); } break; case 8: if(prior!=5&&prior!=7){ pushpath(current,8,5); go(8,5); pushpath(current,8,7); go(8,7); } break; default:break; } } //puch_back next point void pushpath(MapInfo& map,int front,int back) { int temp=map.a[front] map.a[front]=map.a[back]; map.a[back]=temp; // map.selfnum=mapInfo.back.selfnum+1; // map.globnum=mapInfo.back.globnum+mapInfo.size(); mapInfo.push_back(map); swap(map.a[front],map.a[back]); } void main() { int i; MapInfo info; for(i=0;i<9;i++){ info.a[i]=a[i]; } // info.selfnum=0; // info.globnum=0; mapInfo.push_back(info); if(go(0,8)){//if has arrived at the result //print the map of every step for(i=0;i<mapInfo.size();i++){ for(j=0;j<9;j++) cout<<mapInfo.a[i]<<" "; cout<<endl; } } } 你可以应用我的函数到你的应用程序 根据你使用的数据结构可作适当修改 其中的主函数 和 输入 只为说明使用