DAExer3.pdf

‫))ﺑﻪ ﻧﺎم ﺧﺪاوﻧﺪ ﺑﺨﺸﻨﺪه ي ﻣﻬﺮﺑﺎن ((‬
‫ﺗﻤﺮﻳﻦ ﺷﻤﺎره ي ‪ -‬درس ﻃﺮاﺣﻲ اﻟﮕﻮرﻳﺘﻤﻬﺎ‬
‫ﻣﻬﻠﺖ ﺗﺤﻮﻳﻞ ﺗﻤﺮﻳﻦ ‪ 1387/2/15 :‬ﺳﺎﻋﺖ ‪23:59‬‬
‫) ‪(DFS, BFS‬‬
‫ﻣﻼﺣﻈﺎت ‪:‬‬
‫ اﻳﻦ ﺗﻤﺮﻳﻦ ﻫﻢ داراي ﻗﺴﻤﺘﻬﺎي ﺗﺌﻮري و ﻫﻢ ﻋﻤﻠﻲ اﺳﺖ‪ .‬ﭘﺎﺳﺦ ﻗﺴﻤﺘﻬﺎي ﺗﺌﻮري و ﻋﻤﻠﻲ را در ﻗﺎﻟﺐ ﻳﻚ ﻓﺎﻳﻞ ﻓﺸﺮده ﺑﻪ ﻧﺎم‬‫‪ Ex3-yourID.zip‬ﺑﻪ آدرس ‪ [email protected]‬ﻣﻴﻞ ﻛﻨﻴﺪ‪ .‬ﻋﻨﻮان ﭘﺴﺖ اﻟﻜﺘﺮوﻧﻴﻜﻲ ﻧﻴﺰ ‪ Ex3-yourID‬ﺑﺎﻳﺪ ﺑﺎﺷﺪ‪.‬‬
‫ ﺑﻪ ﻫﻴﭻ وﺟﻪ ﻛﺎر ﻫﺎي ﻏﻴﺮ اﺧﻼﻗﻲ ﻣﺜﻞ روﻧﻮﻳﺴﻲ و ﻛﭙﻲ ﺑﺮﻧﺎﻣﻪ ي دﻳﮕﺮان و ‪ ....‬ﭘﺬﻳﺮﻓﺘﻪ ﻧﻴﺴﺖ‪ .‬درﺻﻮرت ﻣﺸﺎﻫﺪه ﻧﻤﺮه ي ﺷﻤﺎ ‪ -100‬در ﻧﻈﺮ‬‫ﮔﺮﻓﺘﻪ ﻣﻲ ﺷﻮد‪) .‬اﮔﺮ ﺗﻤﺮﻳﻨﺎت را ﺑﺎ ﻫﻢ ﻣﻲ ﻧﻮﻳﺴﻴﺪ ﺳﻌﻲ ﻛﻨﻴﺪ ﻃﺮﻳﻖ ﻧﻮﺷﺘﻦ ﺷﻤﺎ ﻣﺎﻧﻨﺪ ﻳﻜﺪﻳﮕﺮ ﻧﺒﺎﺷﺪ‪ .‬ﭼﻮن در ﺻﻮرت ﻣﺸﺎﺑﻬﺖ ﺑﺎ وﺟﻮد ﺑﻲ‬
‫ﮔﻨﺎﻫﻲ‪ ،‬ﮔﻨﺎﻫﻜﺎر ﺷﻨﺎﺧﺘﻪ ﺧﻮاﻫﻴﺪ ﺷﺪ و ﻧﻤﺮه ي ﺧﻮد را از دﺳﺖ ﺧﻮاﻫﻴﺪ داد(‬
‫ ﺑﻪ ﻫﻴﭻ وﺟﻪ زﻣﺎن ﺗﺤﻮﻳﻞ اﻳﻦ ﺗﻤﺮﻳﻦ ﺗﻤﺪﻳﺪ ﻧﻤﻲ ﺷﻮد‪ .‬ﺑﻪ ازاي ﻫﺮﺳﺎﻋﺖ ﺗﺎﺧﻴﺮ‪ 20‬ﻧﻤﺮه )از ‪ 100‬ﻧﻤﺮه( را از دﺳﺖ ﻣﻲ دﻫﻴﺪ‪.‬‬‫‪ -‬ﻫﺮ ﮔﻮﻧﻪ ﺳﻮال و ﻣﺸﻜﻠﻲ و ﻳﺎ اﻳﺮادي را ﻣﻲ ﺗﻮاﻧﻴﺪ ﺑﺎ ‪ [email protected]‬در ﻣﻴﺎن ﺑﮕﺬارﻳﺪ‪.‬‬
‫‪ -1‬ﮔﺮاف ﺷﺒﻪ ﻫﻤﺒﻨﺪ‬
‫☻ﮔﺮاف ﺟﻬﺖ دار ‪ G‬ﺷﺒﻪ ﻫﻤﺒﻨﺪ ﻧﺎﻣﻴﺪه ﻣﻲﺷﻮد اﮔﺮ ﺑﻪ ازاي ﻫﺮ دو راس ‪u‬و ‪ v‬از اﻳﻦ ﮔﺮاف ﺣﺪاﻗﻞ ﻳﻚ ﻣﺴﻴﺮ ﺟﻬﺖ دار از ‪ u‬ﺑﻪ ‪ v‬ﻳﺎ از ‪ v‬ﺑﻪ‬
‫‪ u‬وﺟﻮد داﺷﺘﻪ ﺑﺎﺷﺪ)دﻗﺖ ﻛﻨﻴﺪ ﻛﻪ ﺑﺎ ﻗﻮﻳﺎ ﻫﻤﺒﻨﺪ ﻣﺘﻔﺎوت اﺳﺖ( ﺑﻪ ﻋﻨﻮان ﻣﺜﺎل ﮔﺮاف ﺷﻜﻞ زﻳﺮ ﺷﺒﻪ ﻫﻤﺒﻨﺪ اﺳﺖ‪.‬‬
‫اﻟﮕﻮرﻳﺘﻤﻲ ﺑﺮاي اﻳﻦ ﻛﺎر ﺑﻴﺎﺑﻴﺪ‪ .‬اﻟﮕﻮرﻳﺘﻢ ﺧﻮد را ﺑﻪ دﻗﺖ ﺗﺸﺮﻳﺢ ﻛﻨﻴﺪ‪) .‬ارﺳﺎل ﺷﻮد(‬
‫ﺑﺮﻧﺎﻣﻪ اي ﺑﻨﻮﻳﺴﻴﺪ ﻛﻪ ﺷﺒﻪ ﻫﻤﺒﻨﺪ ﺑﻮدن ﮔﺮاف را ﺑﻴﺎزﻣﺎﻳﺪ ) در ﻓﺎﻳﻞ‪ semiconnect.java‬ﻳﺎ ‪(semiconnect.cpp‬‬
‫در ﺧﻂ اول ﻓﺎﻳﻞ ورودي )‪ (semiconnect.in‬ﻋﺪد ‪ n‬ﺗﻌﺪاد راﺳﻬﺎي ﮔﺮاف آﻣﺪه اﺳﺖ‪ .‬در ‪ n‬ﺳﻄﺮ ﺑﻌﺪي ﻣﺎﺗﺮﻳﺲ ﻣﺠﺎورت ﮔﺮاف وﺟﻮد دارد‪.‬‬
‫در ﻓﺎﻳﻞ ﺧﺮوﺟﻲ )‪ (semmiconnect.out‬ﺑﻪ ازاي ﻣﺜﺒﺖ ﺑﻮدن ﺟﻮاب ﻋﺒﺎرت ‪ Yes‬و در ﻏﻴﺮ اﻳﻦ ﺻﻮرت ﻋﺒﺎرت ‪ No‬را ﺑﻨﻮﻳﺴﻴﺪ‪.‬‬
‫‪ -2‬ﻛﺎرﮔﺮي!!‬
‫☺ ﻛﺎرﮔﺮي را در ﻳﻚ ﻣﺎز در ﻧﻈﺮ ﺑﮕﻴﺮﻳﺪ‪ .‬ﻣﺎز ﻣﺎ ﻳﻚ ﺟﺪول ‪ n*n‬از ‪ 0‬و ‪ 1‬اﺳﺖ ﻛﻪ ‪ 1‬ﺑﻪ ﻣﻌﻨﻲ وﺟﻮد دﻳﻮار در آن ﻧﻘﻄﻪ از ﺟﺪول ﻣﻲﺑﺎﺷﺪ‪ .‬در‬
‫اﺑﺘﺪاي ﻛﺎر ﺟﻌﺒﻪاي در ﻧﻘﻄﻪي )‪ (xb,yb‬از اﻳﻦ ﻣﺎز ﻗﺮار ﮔﺮﻓﺘﻪ اﺳﺖ)ﮔﻮﺷﻪ ي ﺑﺎﻻ ﺳﻤﺖ ﭼﭗ )‪ (1،1‬اﺳﺖ(‪ .‬ﻛﺎرﮔﺮ ﻧﻴﺰ در اﺑﺘﺪاي ﻛﺎر در ﻧﻘﻄﻪ‪-‬‬
‫ي )‪ (xw,yw‬از اﻳﻦ ﻣﺎز ﻗﺮار ﮔﺮﻓﺘﻪ اﺳﺖ‪ .‬در ﻫﺮ ﺣﺮﻛﺖ ﻛﺎرﮔﺮ ﻣﻲﺗﻮاﻧﺪ ﺑﻪ ﺳﻤﺖ ﺷﺮق‪ ،‬ﻏﺮب‪ ،‬ﺷﻤﺎل ﻳﺎ ﺟﻨﻮب در ﺻﻮرت ﻋﺪم وﺟﻮد دﻳﻮار ﻳﻚ‬
‫ﮔﺎم ﺑﺮدارد‪ .‬در ﺻﻮرﺗﻲ ﻛﻪ ﺟﻌﺒﻪ در راﺳﺘﺎي ﺣﺮﻛﺘﺶ ﺑﺎﺷﺪ آن را ﻧﻴﺰ ﻳﻚ واﺣﺪ در راﺳﺘﺎي ﺣﺮﻛﺘﺶ ﻫﻞ ﻣﻲدﻫﺪ)در ﺻﻮرﺗﻲ ﻛﻪ ﺧﺎﻧﻪي ﻣﻘﺼﺪ‬
‫ﺟﻌﺒﻪ دﻳﻮار ﺑﺎﺷﺪ ﻧﻪ ﺟﻌﺒﻪ و ﻧﻪ ﻛﺎرﮔﺮ ﺣﺮﻛﺖ ﻧﺨﻮاﻫﻨﺪ ﻛﺮد‪ .( .‬ﻫﺪف اﻳﻦ اﺳﺖ ﻛﻪ ﻛﺎرﮔﺮ ﺑﺎ ﻛﻤﺘﺮﻳﻦ ﺗﻌﺪاد ﺣﺮﻛﺖ ﺟﻌﺒﻪ را ﺑﻪ ﻧﻘﻄﻪي )‪(xf,yf‬‬
‫ﺑﺮﺳﺎﻧﺪ‪ .‬ﭼﮕﻮﻧﻪ ﺑﺎ اﺳﺘﻔﺎده از اﻟﮕﻮرﻳﺘﻢ ‪ BFS‬ﻣﻲﺗﻮان اﻳﻦ ﻣﺴﺌﻠﻪ را ﺣﻞ ﻛﺮد‪ .‬ﭘﺎﺳﺦ ﺧﻮد را ﺑﻪ دﻗﺖ ﺗﺸﺮﻳﺢ ﻛﻨﻴﺪ‪.‬‬
‫ﺑﺮﻧﺎﻣﻪ اي ﺑﻨﻮﻳﺴﻴﺪ ﻛﻪ اﻳﻦ ﻛﺎر را اﻧﺠﺎم دﻫﺪ)ﻓﺎﻳﻞ ‪ worker.cpp‬ﻳﺎ ‪ (worker.java‬در ﺧﻂ اول ﻓﺎﻳﻞ ورودي )‪ n (worker.in‬ﻧﻮﺷﺘﻪ‬
‫ﺷﺪه اﺳﺖ‪ .‬در ‪ n‬ﺧﻂ ﺑﻌﺪي ﻧﻘﺸﻪي ﻣﺎز ﺑﻪ ﺻﻮرت ﻳﻚ ﺟﺪول ‪ n*n‬از ‪ 0‬و ‪ 1‬آﻣﺪه اﺳﺖ‪ .‬ﭘﺲ از آن در ﺳﻪ ﺧﻂ اﻧﺘﻬﺎﻳﻲ ﻓﺎﻳﻞ ﺑﻪ ﺗﺮﺗﻴﺐ دوﺗﺎﻳﻲ‬
‫ﻫﺎي )‪ (xb,yb‬و )‪ (xw,yw‬و )‪ (xf, yf‬آﻣﺪه اﺳﺖ‪ .‬ﻧﻤﻮﻧﻪ اي از اﻳﻦ ﻓﺎﻳﻞ را در ﺷﻜﻞ زﻳﺮ ﻣﻲﺑﻴﻨﻴﺪ‪.‬‬
‫در ﻓﺎﻳﻞ ﺧﺮوﺟﻲ)‪ (worker.out‬اﺑﺘﺪاﺣﺪاﻗﻞ ﺗﻌﺪاد ﺣﺮﻛﺎت ﻻزم را ﺑﺮاي اﻳﻦ ﻛﺎر ﺑﻨﻮﻳﺴﻴﺪ‪ .‬در ﺻﻮرﺗﻲ ﻛﻪ اﻳﻦ ﻛﺎر اﻧﺠﺎم ﻧﺎﺷﺪﻧﻲ اﺳﺖ ﻋﺪد ‪-1‬‬
‫را در ﻓﺎﻳﻞ ﺑﻨﻮﻳﺴﻴﺪ‪ .‬در ﺧﻂ ﺑﻌﺪي ﻓﺎﻳﻞ ﺧﺮوﺟﻲ ﺣﺮﻛﺎت ﻣﻮرد ﻧﻴﺎز ﻛﺎر ﮔﺮ را ﺑﻪ ﺻﻮرت دﻧﺒﺎﻟﻪ اي از ‪E‬و ‪ W‬و ‪ N‬و ‪ EAST) S‬و‬
‫‪WEST‬و ‪NORTH‬و ‪ (SOUTH‬درج ﻛﻨﻴﺪ‪ .‬ﺑﻪ ﻋﻨﻮان ﻣﺜﺎﻟﻲ از ﺧﺮوﺟﻲ دارﻳﻢ ‪:‬‬
‫‪٢‬‬
٣