刚开始的时候,在bfs里扩展没写好,一直tle。杯具! #include<iostream> #include<cstdio> #include<string> using namespace std; bool vis[70000]; char pil[5][5]; int bin[5][5],sta[5][5],step[70000][2]; bool txt[5][5]; class node { public: int st; int p; int x,y; int father; }; node queue[70000]; int solve(int end) { int i,j,k,sum,star; sum=0; for(i=1;i<=4;i++) for(j=1;j<=4;j++) { sum+=sta[i][j]*bin[i][j]; } for(i=0;i<=65535;i++) vis[i]=true; vis[sum]=false; star=sum; int front=0,rear=0; rear++; queue[rear].st =sum; queue[rear].p =0; queue[rear].father =-1; while(front!=rear) { front++;sum=queue[front].st ; for(i=1;i<=4;i++) for(j=1;j<=4;j++) { sta[i][j]=sum%2; sum/=2; } for(i=1;i<=4;i++) for(j=1;j<=4;j++) { sum=0 ; for(k=1;k<=4;k++) sum+=((sta[i][k]^1)-sta[i][k])*bin[i][k]; for(k=1;k<=4;k++) if(k!=i) sum+=((sta[k][j]^1)-sta[k][j])*bin[k][j]; sum+=queue[front].st ; if(sum>=0&&vis[sum]) { vis[sum]=false; rear++; queue[rear].father =front; queue[rear].p =queue[front].p +1; queue[rear].x =i;queue[rear].y =j; queue[rear].st =sum; if(sum==end) { printf("%d/n",queue[rear].p ); int cnt=0; k=rear; while(queue[k].father!=-1 ) { step[cnt][0]=queue[k].x;step[cnt][1]=queue[k].y; cnt++; k=queue[k].father ; } for(k=cnt-1;k>=0;k--) printf("%d %d/n",step[k][0],step[k][1]); return 0; } } } } } int main() { int i,j; for(i=1;i<=4;i++) for(j=1;j<=4;j++) { cin>>pil[i][j]; if(pil[i][j]=='-') sta[i][j]=1; else sta[i][j]=0; } int k=1; for(i=1;i<=4;i++) for(j=1;j<=4;j++) { bin[i][j]=k; k*=2; } solve(65535); }