USACO6.4.3 Wisconsin Squares(wissqu)

来源:互联网 发布:西安华信软件 编辑:程序博客网 时间:2024/06/06 02:21

按题目的要求搜索就好了,时限5s,基本用不着优化吧

(但是奇怪的是只有一个测试点,并且0.54s就过了)

既然要求字典序最小,除了第一位是d,后续的就是按字典序来枚举搜索咯


/*ID: xsy97051PROG: wissquLANG: C++*/#include <iostream>#include <cstring>#include <cstdio>using namespace std;const int dx[9]={0,1,0,-1,-1,-1,0,1,1};const int dy[9]={0,1,1,1,0,-1,-1,-1,0};char ans1[17],a[6][6];int f[6][6][6],ans2[17],ans3[17],rest[6];bool vis[6][6];int ans;void come(int x,int y,char c){    for(int i=0;i<=8;i++)        f[x+dx[i]][y+dy[i]][c-64]++;}void go(int x,int y,char c){    for(int i=0;i<=8;i++)        f[x+dx[i]][y+dy[i]][c-64]--;}void dfs(int x,int y,int c,int deep){    ans1[deep]=c; ans2[deep]=x; ans3[deep]=y;    if(deep==16)    {        ans++;        if(ans==1)            for(int i=1;i<=16;i++)               cout<<char(ans1[i]+64)<<" "<<ans2[i]<<" "<<ans3[i]<<endl;        return;    }    go(x,y,a[x][y]);    come(x,y,char(c+64));    vis[x][y]=1;    for(int k=1;k<=5;k++)        if(rest[k])            for(int i=1;i<=4;i++)                for(int j=1;j<=4;j++)                    if(f[i][j][k]==0 && !vis[i][j])                    {                        rest[k]--;                        dfs(i,j,k,deep+1);                        rest[k]++;                    }        come(x,y,a[x][y]);    go(x,y,char(c+64));    vis[x][y]=0;}int main(){   freopen("wissqu.in","r",stdin);freopen("wissqu.out","w",stdout);    memset(f,0,sizeof(f));    for(int i=1;i<=5;i++)    rest[i]=3;        for(int i=1;i<=4;i++)    {        for(int j=1;j<=4;j++)        {            cin>>a[i][j];            come(i,j,a[i][j]);        }        getchar();    }    memset(vis,0,sizeof(vis));    ans=0;    for(int i=1;i<=4;i++)        for(int j=1;j<=4;j++)            if(f[i][j][4]==0)                dfs(i,j,4,1);    cout<<ans<<endl;return 0;}



0 0