来自 codechef 的益智游戏

A puzzle game from codechef

有人可以解释一下 cpp 中这个问题的解决方案及其工作原理吗 使用 STL 可以提高效率吗?

http://www.codechef.com/problems/H1

如果您能解释这个特定的逻辑及其时间复杂度,那将非常有帮助。


#include <cstdio>
using namespace std;
 
int board[9],q[178000]={123456789},powers[9]={100000000,10000000,1000000,100000,10000,1000,100,10,1};
int posn,fromposn,front=-1,back=1;
char found[98765435]={0};
bool prime[18]={0,0,1,1,0,1,0,1,0,0,0,1,0,1,0,0,0,1};
 
void moveit(int p1,int p2){
  int diff=board[p2]-board[p1];
  posn=fromposn+diff*powers[p1]-diff*powers[p2];
  int posndiv10=posn/10;
  if(!found[posndiv10]){
    found[posndiv10]=found[fromposn/10]+1;
    q[back++]=posn;
  }
}
 
int main(){
  int t,i,d;
 
#ifndef ONLINE_JUDGE
  freopen("in.txt","r",stdin);
#endif
  found[12345678]=1;
  while(++front<back){
    for(posn=fromposn=q[front],i=8;i>=0;i--){
      board[i]=posn%10;
      posn/=10;
    }
    if(prime[board[0]+board[1]]) moveit(0,1);
    if(prime[board[0]+board[3]]) moveit(0,3);
    if(prime[board[1]+board[2]]) moveit(1,2);
    if(prime[board[1]+board[4]]) moveit(1,4);
    if(prime[board[2]+board[5]]) moveit(2,5);
    if(prime[board[3]+board[4]]) moveit(3,4);
    if(prime[board[3]+board[6]]) moveit(3,6);
    if(prime[board[4]+board[5]]) moveit(4,5);
    if(prime[board[4]+board[7]]) moveit(4,7);
    if(prime[board[5]+board[8]]) moveit(5,8);
    if(prime[board[6]+board[7]]) moveit(6,7);
    if(prime[board[7]+board[8]]) moveit(7,8);
  }
  scanf("%d",&t);
  while(t--){
    for(posn=i=0;i<8;i++){
      scanf("%d",&d);
      posn=posn*10+d;
    }
    scanf("%d",&d);
    if(found[posn]) printf("%d\n",found[posn]-1);
    else puts("-1");
  }
  return 0;
}   

它首先构建一个 table 所有可解板,以数字表示,表示该板的解决方案有多少步。

然后它通过在 table.

中查找来解决每个测试用例

每个测试用例的时间复杂度是常数。

我怀疑标准库中是否有任何东西可以提高它的效率。