01迷宫(洛谷-P1141)
生活随笔
收集整理的這篇文章主要介紹了
01迷宫(洛谷-P1141)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題目描述
有一個僅由數字0與1組成的n×n格迷宮。若你位于一格0上,那么你可以移動到相鄰4格中的某一格1上,同樣若你位于一格1上,那么你可以移動到相鄰4格中的某一格0上。
你的任務是:對于給定的迷宮,詢問從某一格開始能移動到多少個格子(包含自身)。
輸入輸出格式
輸入格式:
輸入的第1行為兩個正整數n,m。
下面n行,每行n個字符,字符只可能是0或者1,字符之間沒有空格。
接下來m行,每行2個用空格分隔的正整數i,j,對應了迷宮中第i行第j列的一個格子,詢問從這一格開始能移動到多少格。
輸出格式:
輸出包括m行,對于每個詢問輸出相應答案。
輸入輸出樣例
輸入樣例#1:
2 2
01
10
1 1
2 2
輸出樣例#1:
4
4
源代碼
#include<iostream> using namespace std;int n,m,x,y; int a[1001][1001]; char ch[1010][1010]; int judge[1001][1001]; int sum; int original_x[1001][1001]={0}; int original_y[1001][1001]={0}; int current_x, current_y; void dfs(int x, int y);int main() {int i,j;cin>>n>>m;//輸入迷宮大小n與詢問答案數mfor(i=1;i<=n;i++){for(j=1;j<=n;j++){ cin>>ch[i][j];a[i][j]=ch[i][j]-48;}}for(i=1;i<=n;i++)//設置邊界,便于判重for(j=1;j<=n;j++)judge[i][j]=-1;for(i=1;i<=m;i++){sum=0;//步數清零cin>>x>>y;//輸入詢問答案的坐標if(judge[original_x[x][y]][original_y[x][y]]>0)//判斷當前點是不是以前搜索過的 {cout<<judge[original_x[x][y]][original_y[x][y]]<<endl;continue;}current_x=x;//記錄當前點坐標xcurrent_y=y;//記錄當前點坐標ydfs(x,y);//開始搜索cout<<sum<<endl;judge[x][y]=sum;//記錄當前步驟,用于判斷original_x[x][y]=x;original_y[x][y]=y;}return 0; }void dfs(int x, int y) {int direction_x[4]={1,-1,0,0,},direction_y[4]={0,0,1,-1};//方向坐標int i; if(x>n||x<1||y>n||y<1)//搜索終止條件return;if(judge[x][y]!=-1)//記憶化搜索,判重 return;sum++;//步數+1original_x[x][y]=current_x;//更改坐標xoriginal_y[x][y]=current_y;//更改坐標yjudge[x][y]=0;//標記當前點for(i=0;i<4;i++){if(a[x+direction_x[i]][y+direction_y[i]]!=a[x][y])//與當前坐標不符時dfs(x+direction_x[i],y+direction_y[i]);//進一步搜索} }?
總結
以上是生活随笔為你收集整理的01迷宫(洛谷-P1141)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 暑期训练日志----2018.7.30
- 下一篇: 病人排队(信息学奥赛一本通-T1183)