#5489: 這是我寫的,已經AC了


benny89932989 (巧比 GUO)

學校 : 新北市立板橋高級中學
編號 : 19588
來源 : [114.34.243.31]
最後登入時間 :
2011-12-28 16:42:47
d057. 11494 - Queen -- UVa11494 | From: [59.112.249.104] | 發表日期 : 2011-08-04 09:35

我會把解答放上來並不是我唱秋,我只是想讓跟我一樣的新手在不會想邏輯時,有個參考依據,所以請勿抄襲,若有高手有更好的解法請盡量告訴我,我想進步啊!!!\(^0^)/

//d.057詳解版by 放空ing
#include <iostream>
using namespace std;

int main(){
 int x1, y1, x2, y2, a, b, w;            //原座標為(x1,y2),之後移動到的點是(x2,y2)
 while(cin>>x1>>y1>>x2>>y2,x1>0 || y1>0 || x2>0 || y2>0){
  if(x1 > x2)
   a=x1-x2;                        //a=x座標的移動
  else if(x1 < x2)
   a=x2-x1;
  else
   a=0;
 if(y1 > y2)
  b=y1-y2;                            //b=y座標的移動
 else if(y1 < y2)
  b=y2-y1;
 else
  b=0;
 if(a == b && a && b)
         w=1;                               //w=所要移動的步數,這裡的條件是a==b,而且a和b不為0,這樣就會是等腰直角三角形,所以只需動1步
 else if(a != b && a==0 && b)
  w=1;                                //當a!=b,而且a==0,b!=0時,代表是在作Y座標的移動,移動路線會為一垂直的直線,所以只需動1步
 else if(a != b && a && b ==0)
  w=1;                                //當a!=b,而且a!=0,b==0時,代表是在作X座標的移動,移動路線會為一水平的直線,所以只需動1步
 else if(a !=b)
  w=2;                                //當a!=b,代表2點之間不夠成等腰直角三角形,所以就需動2步
 else if(a == b && a==0 && b==0)
  w=0;                                //當a==b,且a==0,b==0時,代表在原點所以不需移動
 cout<<w<<endl;
 }
}

 
#7830: Re:這是我寫的,已經AC了


Thebigbang (喜憨外星人)

學校 : 國立臺中第一高級中學
編號 : 32618
來源 : [61.219.170.5]
最後登入時間 :
2020-07-29 20:12:21
d057. 11494 - Queen -- UVa11494 | From: [219.85.245.110] | 發表日期 : 2013-06-07 15:30

我會把解答放上來並不是我唱秋,我只是想讓跟我一樣的新手在不會想邏輯時,有個參考依據,所以請勿抄襲,若有高手有更好的解法請盡量告訴我,我想進步啊!!!\(^0^)/

//d.057詳解版by 放空ing
#include
using namespace std;

int main(){
 int x1, y1, x2, y2, a, b, w;            //原座標為(x1,y2),之後移動到的點是(x2,y2)
 while(cin>>x1>>y1>>x2>>y2,x1>0 || y1>0 || x2>0 || y2>0){
  if(x1 > x2)
   a=x1-x2;                        //a=x座標的移動
  else if(x1 < x2)
   a=x2-x1;
  else
   a=0;
 if(y1 > y2)
  b=y1-y2;                            //b=y座標的移動
 else if(y1 < y2)
  b=y2-y1;
 else
  b=0;
 if(a == b && a && b)
         w=1;                               //w=所要移動的步數,這裡的條件是a==b,而且a和b不為0,這樣就會是等腰直角三角形,所以只需動1步
 else if(a != b && a==0 && b)
  w=1;                                //當a!=b,而且a==0,b!=0時,代表是在作Y座標的移動,移動路線會為一垂直的直線,所以只需動1步
 else if(a != b && a && b ==0)
  w=1;                                //當a!=b,而且a!=0,b==0時,代表是在作X座標的移動,移動路線會為一水平的直線,所以只需動1步
 else if(a !=b)
  w=2;                                //當a!=b,代表2點之間不夠成等腰直角三角形,所以就需動2步
 else if(a == b && a==0 && b==0)
  w=0;                                //當a==b,且a==0,b==0時,代表在原點所以不需移動
 cout< }
}



我是用一次函數做的XD

假設皇后(a,b)在一個xy平面上 

那任一點(x,y)只要符合下列其中一個函數就只要走1步

x=a

y=b

y=x+(b-a)

y=-x+(a+b)

剩下的除了x=a且y=b(皇后本身那一點)是0步

其它的都是2步

以下是我判斷部份的程式碼(我用C語言寫的:P)

if(xy[0] == xy[2] && xy[1] == xy[3]){ //x=a且y=b
      printf("0\n");    
    }
    else if(xy[0] == xy[2] || xy[1] == xy[3]){ //x=a或y=b
      printf("1\n");    
    }
    else if(xy[3]-xy[2]-xy[1]+xy[0] == 0){ //y-x-(b-a)=0
      printf("1\n");   
    }
    else if(xy[3]+xy[2]-xy[1]-xy[0] == 0){ //y+x-(a+b)=0
      printf("1\n");    
    }
    else{
      printf("2\n");

註:xy[0]=a , xy[1]=b , xy[2]=x , xy[3]=y

 
#7831: Re:這是我寫的,已經AC了


Thebigbang (喜憨外星人)

學校 : 國立臺中第一高級中學
編號 : 32618
來源 : [61.219.170.5]
最後登入時間 :
2020-07-29 20:12:21
d057. 11494 - Queen -- UVa11494 | From: [219.85.245.110] | 發表日期 : 2013-06-07 15:32

我會把解答放上來並不是我唱秋,我只是想讓跟我一樣的新手在不會想邏輯時,有個參考依據,所以請勿抄襲,若有高手有更好的解法請盡量告訴我,我想進步啊!!!\(^0^)/

//d.057詳解版by 放空ing
#include
using namespace std;

int main(){
 int x1, y1, x2, y2, a, b, w;            //原座標為(x1,y2),之後移動到的點是(x2,y2)
 while(cin>>x1>>y1>>x2>>y2,x1>0 || y1>0 || x2>0 || y2>0){
  if(x1 > x2)
   a=x1-x2;                        //a=x座標的移動
  else if(x1 < x2)
   a=x2-x1;
  else
   a=0;
 if(y1 > y2)
  b=y1-y2;                            //b=y座標的移動
 else if(y1 < y2)
  b=y2-y1;
 else
  b=0;
 if(a == b && a && b)
         w=1;                               //w=所要移動的步數,這裡的條件是a==b,而且a和b不為0,這樣就會是等腰直角三角形,所以只需動1步
 else if(a != b && a==0 && b)
  w=1;                                //當a!=b,而且a==0,b!=0時,代表是在作Y座標的移動,移動路線會為一垂直的直線,所以只需動1步
 else if(a != b && a && b ==0)
  w=1;                                //當a!=b,而且a!=0,b==0時,代表是在作X座標的移動,移動路線會為一水平的直線,所以只需動1步
 else if(a !=b)
  w=2;                                //當a!=b,代表2點之間不夠成等腰直角三角形,所以就需動2步
 else if(a == b && a==0 && b==0)
  w=0;                                //當a==b,且a==0,b==0時,代表在原點所以不需移動
 cout< }
}



我是用一次函數做的XD

假設皇后(a,b)在一個xy平面上 

那任一點(x,y)只要符合下列其中一個函數就只要走1步

x=a

y=b

y=x+(b-a)

y=-x+(a+b)

剩下的除了x=a且y=b(皇后本身那一點)是0步

其它的都是2步

以下是我判斷部份的程式碼(我用C語言寫的:P)

if(xy[0] == xy[2] && xy[1] == xy[3]){ //x=a且y=b
      printf("0\n");    
    }
    else if(xy[0] == xy[2] || xy[1] == xy[3]){ //x=a或y=b
      printf("1\n");    
    }
    else if(xy[3]-xy[2]-xy[1]+xy[0] == 0){ //y-x-(b-a)=0
      printf("1\n");   
    }
    else if(xy[3]+xy[2]-xy[1]-xy[0] == 0){ //y+x-(a+b)=0
      printf("1\n");    
    }
    else{
      printf("2\n");

註:xy[0]=a , xy[1]=b , xy[2]=x , xy[3]=y


歐歐~我發現我最後那個else少了一個大括號...
 
#8321: Re:這是我寫的,已經AC了


hasd093156 (Solony)

學校 : 長庚大學
編號 : 33550
來源 : [111.246.118.162]
最後登入時間 :
2019-02-07 10:13:31
d057. 11494 - Queen -- UVa11494 | From: [1.168.5.178] | 發表日期 : 2013-10-12 21:05

您的想法跟我的差不多

只是我一直苦於如何表達做標上的移動

看到您的程式碼我才恍然大悟居然可以這樣寫XD

感謝您的分享 


 
ZeroJudge Forum