要作一個有心人——王曉燕ios
因爲肺炎疫情的爆發,假期去學校機房上課的計劃泡湯了測試
但是王主任早就給咱們列好了計劃 傳統藝能spa
而後他就給咱們整了一大堆題,其中就包含很是簡單的搜索題code
因而就有了這道簡單的題目:ci
【題目描述】 馬在中國象棋以日字形規則移動。 請編寫一段程序,給定n×m大小的棋盤,以及馬的初始位置(x,y),要求不能重複通過棋盤上的同一個點,計算馬能夠有多少途徑遍歷棋盤上的全部點。 【輸入】 第一行爲整數T(T < 10),表示測試數據組數。 每一組測試數據包含一行,爲四個整數,分別爲棋盤的大小以及初始位置座標n,m,x,y。(0≤x≤n-1,0≤y≤m-1, m < 10, n < 10)。 【輸出】 每組測試數據包含一行,爲一個整數,表示馬能遍歷棋盤的途徑總數,0爲沒法遍歷一次。 【輸入樣例】 1 5 4 0 0 【輸出樣例】 32
這道題思路比較簡單string
從起點開始按日字格走,當步數等於n*m的時候,就表明着遍歷了一次,那麼答案加一it
因而就有了下面的代碼:io
#include<iostream> #include<cstdio> #include<algorithm> #include<cstring> using namespace std; const int dx[]={0,1,1,2,2,-1,-1,-2,-2}; const int dy[]={0,2,-2,1,-1,2,-2,1,-1}; int t,ans=0,n,m,sx,sy; bool vis[101][101]; void dfs(int x,int y,int cnt){ if(cnt==n*m)ans++; else{ for(int i=1;i<=8;++i){ int tx=x+dx[i]; int ty=y+dy[i]; if(x>=0&&x<n&&y>=0&&y<m&&vis[tx][ty]==false){ vis[tx][ty]=1; dfs(tx,ty,cnt+1); vis[tx][ty]=0; } } } } int main() { cin>>t; for(int i=1;i<=t;++i){ cin>>n>>m>>sx>>sy; dfs(sx,sy,1); cout<<ans<<endl; ans=0; } system("pause"); return 0; }
OK!編譯運行,把樣例複製上去,按下Enter,而後RE編譯
!?RE,哪裏出了問題?class
經過仔細觀察咱們發現(jzh大佬說不能用肉眼看),在判斷是否出界時候應該要用移動後的座標tx,ty
打標也不太對,應當在當前座標點處打標
這纔有了真正的AC代碼:
#include<iostream> #include<cstdio> #include<algorithm> #include<cstring> using namespace std; const int dx[]={0,1,1,2,2,-1,-1,-2,-2}; const int dy[]={0,2,-2,1,-1,2,-2,1,-1}; int t,ans=0,n,m,sx,sy; bool vis[101][101]; void dfs(int x,int y,int cnt){ if(cnt==n*m)ans++; else{ for(int i=1;i<=8;++i){ int tx=x+dx[i]; int ty=y+dy[i]; if(tx>=0&&tx<n&&ty>=0&&ty<m&&vis[tx][ty]==false){ vis[x][y]=1; dfs(tx,ty,cnt+1); vis[x][y]=0; } } } } int main() { cin>>t; for(int i=1;i<=t;++i){ cin>>n>>m>>sx>>sy; dfs(sx,sy,1); cout<<ans<<endl; ans=0; } system("pause"); return 0; }
這個故事告訴咱們,要作一個有心人。否則就會和別人產生差距,是一定AK不了IOI的....