hdu 4708 Rotation Lock Puzzle

来源:互联网 发布:mac os 中英文切换 编辑:程序博客网 时间:2024/05/29 21:16

分析:简单的BFS,只要预处理4个对角和最小的步数即可解决。

#include<iostream>#include<cstdio>#include<cstring>#include<queue>using namespace std;const int maxn = 10;struct Node{    int ss,val,x,ran;    Node(int a=0,int c=0,int d=0,int e=0){        x=a;ss=c;val=d;ran=e;    }};int n,sum[maxn][maxn],step[maxn][maxn],Max,Maxs;void bfs(){    queue<Node>q;    q.push(Node(n/2,0,sum[n/2][n/2],0));    while(!q.empty()){        Node on=q.front();        q.pop();        int ran=on.ran;        int xx=on.x;        if(xx==0){            if(Max<on.val){                Max=on.val;                Maxs=on.ss;            }            else if(Max==on.val){                Maxs=min(Maxs,on.ss);            }            continue;        }        for(int i=xx-1;i<xx+ran*2+1;i++)            q.push(Node(xx-1,on.ss+step[xx-1][i],on.val+sum[xx-1][i],ran+1));    }}int main(){    while(~scanf("%d",&n) && n){        for(int i=0;i<n;i++){            for(int j=0;j<n;j++){                scanf("%d",&sum[i][j]);            }        }        for(int i=0;i<n/2;i++){            for(int j=i;j<n-i-1;j++){                sum[i][j]=sum[i][j]+sum[j][n-i-1]+sum[n-i-1][n-j-1]+sum[n-j-1][i];                step[i][j]=min(j-i,n-(j-i)-1);            }        }        Max=-1;        bfs();        printf("%d %d\n",Max,Maxs);    }}


原创粉丝点击