我們可以建立一個陣列來儲存硬幣的狀態
假設 -1代表硬幣不確定 0代表硬幣必定正常 1代表硬幣可能過輕 2代表硬幣可能過重 3代表硬幣有極高的機率過輕 4代表硬幣有極高的機率過重
如果出現 even
代表天平兩端的硬幣都是正常的(天平兩端的硬幣狀態強制設為0,且不可再更改)
如果出現 up
代表天坪左端出現的硬幣可能過重,或右端出現的硬幣可能過輕
這時我們可以設置左端硬幣狀態
若左端硬幣狀態為-1時,就設為2
若左端硬幣狀態為0時,不能變動
若左端硬幣狀態為1時,就設為0 (因為一個硬幣前個狀態為可能過輕,下個狀態變為可能過重,代表他其實是正常的硬幣)
若左端硬幣狀態為2時,就設為4 (因為一個硬幣前個狀態為可能過重,下個狀態變仍為過重,代表他有很高的機率是過重的硬幣)
同理
若左端硬幣狀態為-1時,就設為1
若左端硬幣狀態為0時,不能變動
若左端硬幣狀態為1時,就設為3 (因為一個硬幣前個狀態為可能過輕,下個狀態變仍為過輕,代表他有很高的機率是過輕的硬幣)
若左端硬幣狀態為2時,就設為0 (因為一個硬幣前個狀態為可能過重,下個狀態變為可能過輕,代表他其實是正常的硬幣)
如果出現 down (做法與上方類似,只是要顛倒過來)
最後我們查看硬幣狀態陣列中是否有3或4
如果有3的話必不會有4,有4的話必不會有3 (因為題目有唯一解)
假如有3,我們就說該硬幣過輕
如果硬幣狀態陣列中沒有3也沒有4,那就看有沒有1或2
如果有1的話必不會有2,有2的話必不會有1 (因為題目有唯一解)
假如有2,我們就說該硬幣過重
}
照著上面解題方向打的只有把0跟1顛倒
不知道哪裡寫錯 一直卡在WA 7
您的答案為: K is the counterfeit coin and it is light. 正確答案為: A is the counterfeit coin and it is light.
}
照著上面解題方向打的只有把0跟1顛倒
不知道哪裡寫錯 一直卡在WA 7
您的答案為: K is the counterfeit coin and it is light. 正確答案為: A is the counterfeit coin and it is light.
#include <iostream>
#include <string>
#include <cmath>
#include<string.h>
#include<map>
using namespace std;
int main()
{
int n;
while(cin >> n)
{getchar();
while(n--)
{int f[12]={0};
for(int p=0;p<3;p++)
{string s;
int flag=0,flag1=0;
getline (cin, s);
for(int i=0;i<s.size();i++)
{if(s[i]=='e')
{flag=1;break;}
if(s[i]=='u')
{flag1=1;break;}
if(s[i]=='d')
break;
}
if(flag==1)
{
for(int i=0;i<s.size();i++)
if(s[i]>='A'&&s[i]<='Z')
f[s[i]-'A']=-1;
}
if(flag1==1)
{int k;
for( k=0;s[k]!=' ';k++)
{ if(s[k]>='A'&&s[k]<='Z')
{switch(f[s[k]-'A'])
{case 0:
f[s[k]-'A']=1;
break;
case 1:
f[s[k]-'A']=3;
break;
case 2:
f[s[k]-'A']=-1;
break;
}
}
}
for(k=k+1;k!=' ';k++)
{if(s[k]>='A'&&s[k]<='Z')
{switch(f[s[k]-'A'])
{case 0:
f[s[k]-'A']=2;
break;
case 2:
f[s[k]-'A']=4;
break;
case 1:
f[s[k]-'A']=-1;
break;
}
}
}
}
if(flag==0&&flag1==0)
{int o;
for(o=0;s[o]!=' ';o++)
{if(s[o]>='A'&&s[o]<='Z')
{switch(f[s[o]-'A'])
{case 0:
f[s[o]-'A']=2;
break;
case 2:
f[s[o]-'A']=4;
break;
case 1:
f[s[o]-'A']=-1;
break;
}
}
}
for( o=o+1;s[o]!=' ';o++)
{ if(s[o]>='A'&&s[o]<='Z')
{switch(f[s[o]-'A'])
{case 0:
f[s[o]-'A']=1;
break;
case 1:
f[s[o]-'A']=3;
break;
case 2:
f[s[o]-'A']=-1;
break;
}
}
}
}
}
int check=0;
for(int i=0;i<12;i++)
{if(f[i]==3)
{check=1;
cout <<char(i+'A')<<" is the counterfeit coin and it is "<<"heavy."<<endl;}
if(f[i]==4)
{check=1;
cout <<char(i+'A')<<" is the counterfeit coin and it is "<<"light."<<endl;
}
}
if(check==0)
for(int i=0;i<12;i++)
{if(f[i]==1)
cout <<char(i+'A')<<" is the counterfeit coin and it is "<<"heavy."<<endl;
if(f[i]==2)
cout <<char(i+'A')<<" is the counterfeit coin and it is "<<"light."<<endl;
}
}
}
return 0;
}
我們可以建立一個陣列來儲存硬幣的狀態
假設 -1代表硬幣不確定 0代表硬幣必定正常 1代表硬幣可能過輕 2代表硬幣可能過重 3代表硬幣有極高的機率過輕 4代表硬幣有極高的機率過重
如果出現 even
代表天平兩端的硬幣都是正常的(天平兩端的硬幣狀態強制設為0,且不可再更改)
如果出現 up
代表天坪左端出現的硬幣可能過重,或右端出現的硬幣可能過輕
這時我們可以設置左端硬幣狀態
若左端硬幣狀態為-1時,就設為2
若左端硬幣狀態為0時,不能變動
若左端硬幣狀態為1時,就設為0 (因為一個硬幣前個狀態為可能過輕,下個狀態變為可能過重,代表他其實是正常的硬幣)
若左端硬幣狀態為2時,就設為4 (因為一個硬幣前個狀態為可能過重,下個狀態變仍為過重,代表他有很高的機率是過重的硬幣)
同理
若左端硬幣狀態為-1時,就設為1
若左端硬幣狀態為0時,不能變動
若左端硬幣狀態為1時,就設為3 (因為一個硬幣前個狀態為可能過輕,下個狀態變仍為過輕,代表他有很高的機率是過輕的硬幣)
若左端硬幣狀態為2時,就設為0 (因為一個硬幣前個狀態為可能過重,下個狀態變為可能過輕,代表他其實是正常的硬幣)
如果出現 down (做法與上方類似,只是要顛倒過來)
最後我們查看硬幣狀態陣列中是否有3或4
如果有3的話必不會有4,有4的話必不會有3 (因為題目有唯一解)
假如有3,我們就說該硬幣過輕
如果硬幣狀態陣列中沒有3也沒有4,那就看有沒有1或2
如果有1的話必不會有2,有2的話必不會有1 (因為題目有唯一解)
假如有2,我們就說該硬幣過重
另外,還有可能左端是3 or 4 然後又被認為是 1 or 2 的情況