Online Judge | Problem Set | Authors | Online Contests | User | ||||||
---|---|---|---|---|---|---|---|---|---|---|
Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest |
bfs~~用位运算压缩,附代码#include <cstdio> #include <cstring> #include <iostream> using namespace std; int a[5][5],x; struct poj { int num; long long step; }q[100005]; bool ans[70000]; int get_num(int x,int k1,int k2) { int a[5][5],w=0; memset(a,0,sizeof(a)); for(int i=1;i<=4;i++) for(int j=1;j<=4;j++) { a[i][j]=x%2; x/=2; } a[k1][k2]=1-a[k1][k2]; if(k2-1>0)a[k1][k2-1]=1-a[k1][k2-1]; if(k2+1<5)a[k1][k2+1]=1-a[k1][k2+1]; if(k1-1>0)a[k1-1][k2]=1-a[k1-1][k2]; if(k1+1<5)a[k1+1][k2]=1-a[k1+1][k2]; int y=0; for(int i=1;i<=4;i++) for(int j=1;j<=4;j++) y+=a[i][j]<<((i-1)*4+j)-1; return y; } long long bfs() { if(x==0 || x==65535)return 0; memset(ans,0,sizeof(ans)); int l,r,tmp; l=r=1;q[l].num=x;q[l].step=0; while(l<=r) { for(int i=1;i<=4;i++) { for(int j=1;j<=4;j++) { tmp=get_num(q[l].num,i,j); if(!ans[tmp]) { ans[tmp]=1; if(tmp==0 || tmp==65535)return q[l].step+1; r++; q[r].num=tmp; q[r].step=q[l].step+1; } } } l++; } return -1; } int main() { char c; for(int i=1;i<=4;i++) for(int j=1;j<=4;j++) { cin>>c; if(c=='b')a[i][j]=0; else a[i][j]=1; } for(int i=1;i<=4;i++) for(int j=1;j<=4;j++) x+=a[i][j]<<((i-1)*4+j)-1; long long ans=bfs(); if(ans<0)printf("Impossible\n"); else printf("%I64d\n",ans); return 0; } Followed by:
Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator