POJ 1077
来源:互联网 发布:usb供电软件 编辑:程序博客网 时间:2024/05/29 19:33
TLE的两个代码:
①
#include <iostream>#include <cstdio>#include <queue>#include <map>#include <string>using namespace std;long int fac[]={1,1,2,6,24,120,720,5040,40320,362880};struct eight{int st[10];string path;int pos;};int Cantor(int *s,int n){int i,j,num,temp;num=0;for (i=0;i<n;i++){temp=0;for (j=i+1;j<n;j++)if (s[j]<s[i])temp++;num+=fac[n-1-i]*temp;}return num;}int main(){int i;char c; eight start;queue<eight> A;int aim[9]={1,2,3,4,5,6,7,8,0};int Aim=Cantor(aim,9);int visit[362881]; for (i=0;i<=8;i++) { scanf("%c",&c); if (c=='x') { start.st[i]=0; start.pos=i; } else start.st[i]=c-'0'; getchar(); } A.push(start); int can; while (!A.empty() && Cantor(A.front().st,9)!=Aim) { eight temp; for (i=0;i<=8;i++) temp.st[i]=A.front().st[i]; temp.pos=A.front().pos; temp.path=A.front().path; if (A.front().pos-3>=0) { temp.pos=A.front().pos-3; temp.st[A.front().pos]=temp.st[temp.pos]; temp.st[temp.pos]=0; temp.path+='u'; } can=Cantor(temp.st,9); if (visit[can]!=1) { A.push(temp); visit[can]=1; } for (i=0;i<=8;i++) temp.st[i]=A.front().st[i]; temp.pos=A.front().pos; temp.path=A.front().path; if (A.front().pos+3<=8) { temp.pos=A.front().pos+3; temp.st[A.front().pos]=temp.st[temp.pos]; temp.st[temp.pos]=0; temp.path+='d'; } can=Cantor(temp.st,9); if (visit[can]!=1) { A.push(temp); visit[can]=1; } for (i=0;i<=8;i++) temp.st[i]=A.front().st[i]; temp.pos=A.front().pos; temp.path=A.front().path; if (A.front().pos!=0 && A.front().pos!=3 && A.front().pos!=6) { temp.pos=A.front().pos-1; temp.st[A.front().pos]=temp.st[temp.pos]; temp.st[temp.pos]=0; temp.path+='l'; } can=Cantor(temp.st,9); if (visit[can]!=1) { A.push(temp); visit[can]=1; } for (i=0;i<=8;i++) temp.st[i]=A.front().st[i]; temp.pos=A.front().pos; temp.path=A.front().path; if (A.front().pos!=2 && A.front().pos!=5 && A.front().pos!=8) { temp.pos=A.front().pos+1; temp.st[A.front().pos]=temp.st[temp.pos]; temp.st[temp.pos]=0; temp.path+='r'; } can=Cantor(temp.st,9); if (visit[can]!=1) { A.push(temp); visit[can]=1; } A.pop(); } if (A.empty()) cout << "unsolvable" << endl; else cout << A.front().path << endl;return 0;}
②
#include <iostream>#include <cstdio>#include <queue>#include <map>#include <string>using namespace std;struct eight{string st;string path;int pos;};int main(){int i; eight start;queue<eight> A;map<string,int> visit;char str[10];string aim("12345678x");str[9]='\0'; for (i=0;i<=8;i++) { scanf("%c",&str[i]); if (str[i]=='x') start.pos=i; getchar(); } start.st=str; A.push(start); while (!A.empty() && A.front().st!=aim) { eight temp; temp.st=A.front().st; temp.path=A.front().path; if (A.front().pos-3>=0) { temp.pos=A.front().pos-3; temp.st[A.front().pos]=temp.st[temp.pos]; temp.st[temp.pos]='x'; temp.path+='u'; } if (visit[temp.st]!=1) { A.push(temp); visit[temp.st]=1; } temp.st=A.front().st; temp.path=A.front().path; if (A.front().pos+3<=8) { temp.pos=A.front().pos+3; temp.st[A.front().pos]=temp.st[temp.pos]; temp.st[temp.pos]='x'; temp.path+='d'; } if (visit[temp.st]!=1) { A.push(temp); visit[temp.st]=1; } temp.st=A.front().st; temp.path=A.front().path; if (A.front().pos!=0 && A.front().pos!=3 && A.front().pos!=6) { temp.pos=A.front().pos-1; temp.st[A.front().pos]=temp.st[temp.pos]; temp.st[temp.pos]='x'; temp.path+='l'; } if (visit[temp.st]!=1) { A.push(temp); visit[temp.st]=1; } temp.st=A.front().st; temp.path=A.front().path; if (A.front().pos!=2 && A.front().pos!=5 && A.front().pos!=8) { temp.pos=A.front().pos+1; temp.st[A.front().pos]=temp.st[temp.pos]; temp.st[temp.pos]='x'; temp.path+='r'; } if (visit[temp.st]!=1) { A.push(temp); visit[temp.st]=1; } A.pop(); } if (A.empty()) cout << "unsolvable" << endl; else cout << A.front().path << endl;return 0;}
③
#include <iostream>#include <cstdio>#include <cstring>#include <ctime>#include <queue>#include <vector>#include <map>#include <string>using namespace std;long int fac[]={1,1,2,6,24,120,720,5040,40320,362880};struct eight{int st[9];string path;int pos;int g;int h;eight(){g=0; h=0; pos=0;}};int Cantor(const int *s,int n){int i,j,num,temp;num=0;for (i=0;i<n;i++){temp=0;for (j=i+1;j<n;j++)if (s[j]<s[i])temp++;num+=fac[n-1-i]*temp;}return num;}struct ComEdge{bool operator()(eight a,eight b){ return a.g+a.h>b.g+b.h;}};int main(){ while (1) {int i;char c; eight start;priority_queue<eight,vector<eight>,ComEdge> A;int aim[9]={1,2,3,4,5,6,7,8,0};int Aim=Cantor(aim,9);int visit[362881];memset(visit,0,sizeof(visit)); for (i=0;i<=8;i++) { if (!(cin >> c)) return 0; if (c=='x') { start.st[i]=0; start.pos=i; } else start.st[i]=c-'0'; } for (i=0;i<=7;i++) { if (start.st[i]!=i+1) start.h++; } if (start.st[8]!=0) start.h++; A.push(start); int can; while (!A.empty() && Cantor(A.top().st,9)!=Aim) { eight temp1,temp2,temp3,temp4; memcpy(temp1.st,A.top().st,sizeof(int)*9); temp1.pos=A.top().pos; temp1.path=A.top().path; temp1.h=A.top().h; if (A.top().pos-3>=0) { temp1.pos=A.top().pos-3; if (A.top().pos==8) temp1.h++; else if (A.top().pos-3==8) temp1.h--; if (A.top().st[temp1.pos]==A.top().pos+1) temp1.h--; else if (A.top().st[temp1.pos]==A.top().pos-2) temp1.h++; temp1.st[A.top().pos]=temp1.st[temp1.pos]; temp1.st[temp1.pos]=0; temp1.path+='u'; } memcpy(temp2.st,A.top().st,sizeof(A.top().st)); temp2.pos=A.top().pos; temp2.path=A.top().path; temp2.h=A.top().h; if (A.top().pos+3<=8) { temp2.pos=A.top().pos+3; if (A.top().pos==8) temp2.h++; else if (A.top().pos+3==8) temp2.h--; if (A.top().st[temp2.pos]==A.top().pos+1) temp2.h--; else if (A.top().st[temp2.pos]==A.top().pos+4) temp2.h++; temp2.st[A.top().pos]=temp2.st[temp2.pos]; temp2.st[temp2.pos]=0; temp2.path+='d'; } memcpy(temp3.st,A.top().st,sizeof(A.top().st)); temp3.pos=A.top().pos; temp3.path=A.top().path; temp3.h=A.top().h; if (A.top().pos!=0 && A.top().pos!=3 && A.top().pos!=6) { temp3.pos=A.top().pos-1; if (A.top().pos==8) temp3.h++; else if (A.top().pos-1==8) temp3.h--; if (A.top().st[temp3.pos]==A.top().pos+1) temp3.h--; else if (A.top().st[temp3.pos]==A.top().pos) temp3.h++; temp3.st[A.top().pos]=temp3.st[temp3.pos]; temp3.st[temp3.pos]=0; temp3.path+='l'; } memcpy(temp4.st,A.top().st,sizeof(A.top().st)); temp4.pos=A.top().pos; temp4.path=A.top().path; temp4.h=A.top().h; if (A.top().pos!=2 && A.top().pos!=5 && A.top().pos!=8) { temp4.pos=A.top().pos+1; if (A.top().pos==8) temp4.h++; else if (A.top().pos+1==8) temp4.h--; if (A.top().st[temp4.pos]==A.top().pos+1) temp4.h--; else if (A.top().st[temp4.pos]==A.top().pos+2) temp4.h++; temp4.st[A.top().pos]=temp4.st[temp4.pos]; temp4.st[temp4.pos]=0; temp4.path+='r'; } A.pop(); can=Cantor(temp1.st,9); if (visit[can]!=1) { temp1.g=temp1.path.length(); A.push(temp1); visit[can]=1; } can=Cantor(temp2.st,9); if (visit[can]!=1) { temp2.g=temp2.path.length(); A.push(temp2); visit[can]=1; } can=Cantor(temp3.st,9); if (visit[can]!=1) { temp3.g=temp3.path.length(); A.push(temp3); visit[can]=1; } can=Cantor(temp4.st,9); if (visit[can]!=1) { temp4.g=temp4.path.length(); A.push(temp4); visit[can]=1; } } if (A.empty()) cout << "unsolvable" << endl; else cout << A.top().path << endl; }return 0;}
- POJ 1077
- poj 1077
- POJ 1077
- poj 1077 EIGHT
- poj 1077 Eight
- POJ 1077 解题报告
- poj 1077 Eight
- poj 1077 八数码
- POJ 1077 Eight A*
- poj 1077 解题报告
- HDU 1043、POJ 1077
- POJ 1077 eight DBFS
- poj - 1077 - Eight
- poj-1077-Eight
- POJ 1077 Eight
- POJ-1077 Eight
- POJ 1077 Eight
- POJ - 1077 Eight
- HDU 4675 GCD of Sequence
- 日志分析
- request doesn't contain a multipart/form-data or multipart/mixed stream
- FTP协议命令
- 威威猫系列故事——拼车记
- POJ 1077
- nslookup
- oracle 索引
- 扩展js中Array的方法总结
- Android 编译系统(一):Android.mk的学习
- 快速构建实时抓取集群
- PowerDesigner使用教程 —— 概念数据模型
- 小明系列故事——玩转十滴水
- UML - 概述