항 전 1495 비상 콜라
5183 단어 수색 하 다.항주 전기콜라항주 전기 1495
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 8576 Accepted Submission(s): 3397
Problem Description
운동 후에 콜 라 를 마 시 는 것 은 즐 거 운 일이 라 고 생각 하 시 겠 지만 seeyou 는 그렇게 생각 하지 않 습 니 다.매번 seeyou 가 콜 라 를 산 후에 소 는 seeyou 와 함께 이 콜 라 를 공유 하 라 고 요구 하고 꼭 마셔 야 하 는 것 이 seeyou 만큼 많 기 때문이다.그러나 seeyou 의 손 에는 두 개의 컵 만 있 는데 그들의 용량 은 각각 N 밀리리터 와 M 밀리리터 콜라 의 부 피 는 S (S < 101) 밀리리터 (한 병 을 채 울 수 있 음) 이 고 그들 세 개 사이 에 콜 라 를 서로 부 을 수 있다 (모두 눈금 이 없 으 며 S = = N + M, 101 > S > 0, N > 0, M > 0).똑똑 한 ACMER. 똑 같이 나 눌 수 있다 고요?콜 라 를 따 르 는 최소한 의 횟수 를 출력 할 수 있다 면 'NO' 를 출력 할 수 없다 면.
Input
세 개의 정수: S 콜라 의 부피, N 과 M 은 두 컵 의 용량 으로 '000' 으로 끝난다.
Output
동점 이 된다 면 최소한 거꾸로 해 야 할 횟수 를 출력 하 십시오. 그렇지 않 으 면 "NO" 를 출력 하 십시오.
Sample Input
7 4 3
4 1 3
0 0 0
Sample Output
NO
3
Author
seeyou
초지 에 쏟 아 지 는 과정 을 모 의 한 것 입 니 다. 우 리 는 컵 에 모두 번 호 를 매 깁 니 다. 1, 2, 1, 3, 2, 1, 2, 3, 3, 1, 3, 2.자신 이 자신 에 게 줄 수 없 기 때문에 모두 6 개의 조작 이 있 습 니 다. 조작 중 에 두 가지 가능성 이 있 습 니 다. 하 나 는 가득 채 울 수 있 고 나머지 가 있 습 니 다.다른 하 나 는 남 은 것 이 없다 는 것 이다.
이 동작 은 다음 과 같 습 니 다.
for(int i=0;i<3;i++)
{
for(int j=0;j<3;j++)
{
if(i==j)continue;//
if(now.num[i]<=rq[j]-now.num[j])// , rq ,num 。
{
nex.num[j]=now.num[j]+now.num[i];
nex.num[i]=0;
}
else//
{
nex.num[i]=now.num[i]-(rq[j]-now.num[j]);
nex.num[j]=rq[j];
}
for(int ii=0;ii<3;ii++)//
{
if(ii==i||ii==j)
continue;
nex.num[ii]=now.num[ii];
}
nex.output=now.output+1;
if(vis[nex.num[0]][nex.num[1]][nex.num[2]]==0)// vis
{
vis[nex.num[0]][nex.num[1]][nex.num[2]]=1;
s.push(nex);
}
}
}
그리고 목 표를 달성 할 수 있 는 지 를 판단 하 는 것 이다.
if(now.num[0]==now.num[1]&&now.num[2]==0)
{
printf("%d
",now.output);
return ;
}
if(now.num[0]==now.num[2]&&now.num[1]==0)
{
printf("%d
",now.output);
return ;
}
if(now.num[1]==now.num[2]&&now.num[0]==0)
{
printf("%d
",now.output);
return ;
}
그 다음 에 완전한 AC 코드 입 니 다.
#include<stdio.h>
#include<queue>
#include<string.h>
using namespace std;
struct qingkuang
{
int num[3];
int output;
}now,nex;
int vis[102][102][102];
int rq[3];
void bfs(int ss,int n,int m)
{
memset(vis,0,sizeof(vis));
queue<qingkuang>s;
now.num[0]=ss;
now.num[1]=n;
now.num[2]=m;
vis[ss][n][m]=1;
now.output=0;
s.push(now);
while(!s.empty())
{
now=s.front();
if(now.num[0]==now.num[1]&&now.num[2]==0)
{
printf("%d
",now.output);
return ;
}
if(now.num[0]==now.num[2]&&now.num[1]==0)
{
printf("%d
",now.output);
return ;
}
if(now.num[1]==now.num[2]&&now.num[0]==0)
{
printf("%d
",now.output);
return ;
}
s.pop();
for(int i=0;i<3;i++)
{
for(int j=0;j<3;j++)
{
if(i==j)continue;
if(now.num[i]<=rq[j]-now.num[j])
{
nex.num[j]=now.num[j]+now.num[i];
nex.num[i]=0;
}
else
{
nex.num[i]=now.num[i]-(rq[j]-now.num[j]);
nex.num[j]=rq[j];
}
for(int ii=0;ii<3;ii++)
{
if(ii==i||ii==j)
continue;
nex.num[ii]=now.num[ii];
}
nex.output=now.output+1;
if(vis[nex.num[0]][nex.num[1]][nex.num[2]]==0)
{
vis[nex.num[0]][nex.num[1]][nex.num[2]]=1;
s.push(nex);
}
}
}
}
printf("NO
");
return ;
}
int main()
{
int s,n,m;
while(~scanf("%d%d%d",&s,&n,&m))
{
if(s==0&&n==0&&m==0)break;
rq[0]=s;
rq[1]=n;
rq[2]=m;
bfs(s,0,0);
}
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
제1 6 장 파일 에서 텍스트 검색 도구: grep 명령 과 egrep 명령제1 6 장 파일 에서 텍스트 검색 도구: grep 명령 과 egrep 명령 옵션 grep 명령 파일 에서 단 어 를 검색 하면 명령 은 "match pattern"을 포함 하 는 텍스트 줄 을 되 돌려 줍 니 다....
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.