蓝桥杯 标题:纵横火柴旗子
生活随笔
收集整理的這篇文章主要介紹了
蓝桥杯 标题:纵横火柴旗子
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
【編程題】
? ? 這是一個(gè)縱橫火柴棒游戲。如圖[1.jpg],在一個(gè)3x4的方格中,游戲的雙方輪流放置火柴棒。其規(guī)則是:
? ? 1. 不能放置在已經(jīng)放置火柴棒的地方(即只能在空格中放置)。
? ? 2. 火柴棒的方向只能是垂直或水平放置。
? ? 3. 火柴棒不能與其它格子中的火柴“連通”。所謂連通是指兩根火柴棒可以連成一條直線,且中間沒(méi)有其它不同方向的火柴“阻攔”。
? ? 例如:圖[1.jpg]所示的局面下,可以在C2位置豎直放置,但不能水平放置,因?yàn)闀?huì)與A2連通。同樣道理,B2,B3,D2此時(shí)兩種方向都不可以放置。但如果C2豎直放置后,D2就可以水平放置了,因?yàn)椴辉贂?huì)與A2連通(受到了C2的阻擋)。
? ? 4. 游戲雙方輪流放置火柴,不可以棄權(quán),也不可以放多根。直到某一方無(wú)法繼續(xù)放置,則該方為負(fù)(輸?shù)囊环?#xff09;。
????00-1
????-000
????0100
? ? 即用“0”表示空格位置,用“1”表示豎直放置,用“-”表示水平放置。
【輸入、輸出格式要求】
? ? 用戶先輸入整數(shù) n(n<100), 表示接下來(lái)輸入 n 種初始局面,每種局面占3行(多個(gè)局面間沒(méi)有空行)。
? ? 程序則輸出對(duì)應(yīng)的每種初始局面,計(jì)算出的最佳走法(行號(hào)+列號(hào)+放置方式)。
? ? 例如:用戶輸入:
????2
????0111
????-000
????-000
????1111
? ? ?----
????0010
? ?則程序可以輸出:
????00-
????211
? ?輸出結(jié)果的含義為:
? ?對(duì)第一個(gè)局面,在第0行第0列水平放置
? ?對(duì)第二個(gè)局面,在第2行第1列垂直放置
? ?注意:
? ?行號(hào)、列號(hào)都是從0開(kāi)始計(jì)數(shù)的。
? ?對(duì)每種局面可能有多個(gè)最佳放置方法(解不唯一),只輸出一種即可。
using namespace std; char grid[3][4]; char type[]={'1','-'}; bool isPositon(int x,int y,char c)//判斷該位置是否可以放 { if(c=='1')//1有兩種情況不能放,上下都不能為1,但可以用-隔開(kāi) { for(int i=x-1;i>=0;i--) { if(grid[i][y]==c) return false; else break; } for(int i=x+1;i<3;i++) { if(grid[i][y]==c) return false; else break; } } else //-也有兩種情況,左右不能為-,但可以用1隔開(kāi) { for(int j=y-1;j>=0;j--) { if(grid[x][j]=='-') return false; else break; } for(int j=y+1;j<4;j++) { if(grid[x][j]=='-') return false; else break; } } return true; } bool isWin(int x,int y,char c)//判斷在(x,y)放c能不能贏 { if(!isPositon(x,y,c))//不能放 return false; else { //枚舉當(dāng)前情況下,對(duì)方有沒(méi)有贏的可能 for(int i=0;i<3;i++) { for(int j=0;j<4;j++) { if(grid[i][j]=='0') { for(int k=0;k<2;k++) { grid[i][j]=type[k]; if(isWin(i,j,type[k]))//對(duì)方能贏 { grid[i][j]='0'; return false;//我們就不能贏 } grid[i][j]='0'; } } } } return true;//能贏 } } void Judge() { //枚舉可以放的情況 for(int i=0;i<3;i++) { for(int j=0;j<4;j++) { if(grid[i][j]=='0') { for(int k=0;k<2;k++) { grid[i][j]=type[k]; if(isWin(i,j,type[k]))//放該位置能贏 { cout<<i<<' '<<j<<' '<<type[k]<<endl; return ; } grid[i][j]='0'; } } } } } int main() { int n; cin>>n; while(n--) { //輸入數(shù)據(jù) for(int i=0;i<3;i++) { for(int j=0;j<4;j++) { cin>>grid[i][j]; } } //枚舉 Judge(); } }
? ? 這是一個(gè)縱橫火柴棒游戲。如圖[1.jpg],在一個(gè)3x4的方格中,游戲的雙方輪流放置火柴棒。其規(guī)則是:
? ? 1. 不能放置在已經(jīng)放置火柴棒的地方(即只能在空格中放置)。
? ? 2. 火柴棒的方向只能是垂直或水平放置。
? ? 3. 火柴棒不能與其它格子中的火柴“連通”。所謂連通是指兩根火柴棒可以連成一條直線,且中間沒(méi)有其它不同方向的火柴“阻攔”。
? ? 例如:圖[1.jpg]所示的局面下,可以在C2位置豎直放置,但不能水平放置,因?yàn)闀?huì)與A2連通。同樣道理,B2,B3,D2此時(shí)兩種方向都不可以放置。但如果C2豎直放置后,D2就可以水平放置了,因?yàn)椴辉贂?huì)與A2連通(受到了C2的阻擋)。
? ? 4. 游戲雙方輪流放置火柴,不可以棄權(quán),也不可以放多根。直到某一方無(wú)法繼續(xù)放置,則該方為負(fù)(輸?shù)囊环?#xff09;。
? ? 游戲開(kāi)始時(shí)可能已經(jīng)放置了多根火柴。
? ? 你的任務(wù)是:編寫程序,讀入初始狀態(tài),計(jì)算出對(duì)自己最有利的放置方法并輸出。
????00-1
????-000
????0100
? ? 即用“0”表示空格位置,用“1”表示豎直放置,用“-”表示水平放置。
【輸入、輸出格式要求】
? ? 用戶先輸入整數(shù) n(n<100), 表示接下來(lái)輸入 n 種初始局面,每種局面占3行(多個(gè)局面間沒(méi)有空行)。
? ? 程序則輸出對(duì)應(yīng)的每種初始局面,計(jì)算出的最佳走法(行號(hào)+列號(hào)+放置方式)。
? ? 例如:用戶輸入:
????2
????0111
????-000
????-000
????1111
? ? ?----
????0010
? ?則程序可以輸出:
????00-
????211
? ?輸出結(jié)果的含義為:
? ?對(duì)第一個(gè)局面,在第0行第0列水平放置
? ?對(duì)第二個(gè)局面,在第2行第1列垂直放置
? ?注意:
? ?行號(hào)、列號(hào)都是從0開(kāi)始計(jì)數(shù)的。
? ?對(duì)每種局面可能有多個(gè)最佳放置方法(解不唯一),只輸出一種即可。
? ?例如,對(duì)第一個(gè)局面,001 也是正解;最第二個(gè)局面,201也是正解。
總結(jié)
以上是生活随笔為你收集整理的蓝桥杯 标题:纵横火柴旗子的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: java全文检索工具_全文检索工具ela
- 下一篇: matlab dpsk,2DPSK调制与