1. 程式人生 > >用指標訪問二維陣列的問題

用指標訪問二維陣列的問題

關於指標和二維陣列的問題是許多和我一樣的菜鳥初遇的難題 ,下面的一段程式碼是闡述在一個以7*7的陣列遇到上下左右同時有三個為1的即是障礙就將其賭死,可以適用於迷宮程式。

#include<iostream>
#include<iomanip>
#include<windows.h>
#include<math.h>
using namespace std;
int m=7,n=7;
int map[7][7]={{1,1,1,1,1,1,1},{1,0,1,1,1,0,1},{1,0,0,1,0,0,1},{1,0,0,1,0,1,1},{1,0,0,1,0,1,1},{1,0,0,0,0,0,1},{1,1,1,1,1,1,1}};   //測試用的兩組資料
//int map[7][7]={{1,1,1,1,1,1,1},{1,0,1,0,0,0,1},{1,0,0,0,0,1,1},{1,0,1,0,0,0,1},{1,0,0,1,1,0,1},{1,1,0,0,1,0,1},{1,1,1,1,1,1,1}};
void traverse(int *p)      //使用遞迴將不需要走的路堵住
{
 // cout<<p<<"-----"<<&map[m][n]<<endl;
 //system("pause");
 int  *tail=p;         //tail ----堵路指標
 int up=0,down=0,right=0,left=0;
 if(p==&map[5][5])
 {
  return;
 }
 else
 {
  if(*p==0)
  {
   if(*(p-1)==1)  left=1;   
   if(*(p+1)==1)  right=1;
   if(*(p+n)==1)  down=1;
   if(*(p-n)==1)  up=1;
   if(left&&right&&down&&!up)   //表示只有上方是能過走通的
   {
    tail=p;
    *tail=1;
    traverse(p-n);  
   }
   if(left&&right&&up&&!down)
   {
    tail=p;
    *tail=1;
    traverse(p+n);
   }
   if(up&&down&&right&&!left)
   {
    tail=p;
    *tail=1;
    traverse(p-1);
   }
   if(up&&down&&left&&!right)
   {
    tail=p;
    *tail=1;
    traverse(p+1);
   }
   p=tail;
  }
 // cout<<*p<<setw(2);
  p++;
 // system("pause");
  traverse(p);
 }
}
void show()
{
 for(int i=0;i<7;i++)
 {
  for(int j=0;j<7;j++)
  {
   cout<<map[i][j]<<"  ";
  }
  cout<<endl;
 }
}
int main()
{
 show();
 system("pause");
 traverse(&map[1][2]);
 show();
 return 0;
}