[kuangbin带你飞]专题一 简单搜索 M HDU 1495

来源:互联网 发布:机械手臂编程软件 编辑:程序博客网 时间:2024/06/06 09:18

题目地址:https://vjudge.net/contest/65959#problem/M

思路:倒倒倒……写的快死了……所有状态判断是否合法,合法就入队。

AC代码:

#include<bits/stdc++.h>using namespace std;int s,n,m;bool vis[110][110][110];struct pos{int a,b,c,s;};//int bfs(){memset(vis,false,sizeof(vis));pos start;start.a=s;start.b=0;start.c=0;start.s=0;queue<pos>q;q.push(start);vis[s][0][0]=true;while(!q.empty()){pos temp=q.front();q.pop();int a=temp.a,b=temp.b,c=temp.c,s1=temp.s;if((a==b && a==s/2) || (a==c && a==s/2) || (b==c && c==s/2))return s1;if(a>0){//可以倒满bif(a>=n-b && !vis[a-n+b][n][c]){vis[a-n+b][n][c]=true;q.push((pos){a-(n-b),n,c,s1+1});}//无法倒满bif(a<n-b && !vis[0][a+b][c]){vis[0][a+b][c]=true;q.push((pos){0,a+b,c,s1+1});}//可以到满c if(a>=m-c && !vis[a-m+c][b][m]){vis[a-m+c][b][m]=true;q.push((pos){a-(m-c),b,m,s1+1});}//无法倒满cif(a<m-c && !vis[0][b][c+a]){vis[0][b][a+c]=true;q.push((pos){0,b,c+a,s1+1});}}if(b>0){//倒满aif(b>=s-a && !vis[s][b-s+a][c]){q.push((pos){s,b-s+a,c,s1+1});vis[s][b-s+a][c]=true;}//倒不满aif(b<s-a && !vis[a+b][0][c]){q.push((pos){a+b,0,c,s1+1});vis[a+b][0][c]=true;}//可倒满cif(b>=m-c && !vis[a][b-m+c][m]){q.push((pos){a,b-m+c,m,s1+1});vis[a][b-m+c][m]=true;}//倒不满cif(b<m-c && !vis[a][0][b+c]){q.push((pos){a,0,b+c,s1+1});vis[a][0][b+c]=true;}}if(c>0){if(c>=s-a && !vis[s][b][c-s+a]){q.push((pos){s,b,c-s+a,s1+1});vis[s][b][c-s+a]=true;}if(c<s-a && !vis[a+c][b][0]){q.push((pos){a+c,b,0,s1+1});vis[a+c][b][0]=true;}if(c>=n-b && !vis[a][n][c-n+b]){q.push((pos){a,n,c-n+b,s1+1});vis[a][n][c-n+b]=true;}if(c<n-b && !vis[a][b+c][0]){q.push((pos){a,b+c,0,s1+1});vis[a][b+c][0]=true;}}}return -1;}int main(){while(scanf("%d%d%d",&s,&n,&m)){if(s==0 &&n==0 &&m==0)break;if(s%2==0){int temp=bfs();if(temp!=-1)printf("%d\n",temp);elseprintf("NO\n");}else{printf("NO\n");}}}


0 0
原创粉丝点击