// Push Box.cpp : Defines the entry point for the console application.
//
//
#include <stdafx.h>
#include <iostream>
using namespace std;
///*
struct box_grid
{
//short int box_grid_value;
//take notice of the box_grid_value is used to represent grid's attribute,
//each value stand for different meanning
//0 for nothing here(a blank place):::===:::1 for have feces here(no affect)
//2 for box here(can be pushed move):::===:::4 for stone there that can't move or pushed move
//a snail can move to anywhere,and the snail can't change the value of mesh(the snail can move)
int box_grid_l_value;//数组横向坐标
int box_grid_v_value;//数组纵向坐标
bool pushbox;//have pushed?0 for no,1 for had
box_grid *next;
box_grid *previous;
};
box_grid *hrm_box_grid = new box_grid;//{0,0,0,NULL,NULL}
box_grid *pointer = hrm_box_grid;
const int m = 7;
const int n = 8;
int Number_feces_box;//the number of feces or boxs;
int V = 0;//successful number of the box up the feces
int snail_m, snail_n, direct=1, step_vax;//track record the exact row and vertical,direct and move steps
int mesh[m][n] = { {0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0},//{4,4,4,4,4,4,4,4}
{0,0,0,0,0,0,0,0},//
{0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0} };//7 rows and 8 verticals was initialized to 0;
//you can initialize all the element to 0 by this way: static short int mesh[m][n] = { 0 };
void initialize( int mmesh_mirror[m][n]);
void calculate( int mmesh[m][n], int &ssnail,
int &ssnail_n, int &sstep_vax);
void insertchain(int &ssnail_m, int &ssnail_n, box_grid *(&ppointer));//void insertchain();
void deletechain(int &ii, box_grid* &ppointer, int &ssnail_m, int &ssnail_n, int mmesh[m][n]);
void del(box_grid* &ppointer, int &ssnail_m, int &ssnail_n);
void freespace();
void main()
{
printf("Hello World!/n");
initialize(mesh);
cout << "请输入蜗牛的初始行列坐标(空格隔开)";
cin >> snail_m >> snail_n;
snail_m--;//现在就变成了蜗牛处于第snail_m行
snail_n--;//现在就变成了蜗牛处于第snail_n列
if(mesh[snail_m][snail_n]==4 || mesh[snail_m][snail_n]==2 )
{
cout << "蜗牛的地方选的不对!";
delete hrm_box_grid;
//delete pointer;
exit(0);
}
else
{
hrm_box_grid->box_grid_l_value = snail_m;
hrm_box_grid->box_grid_v_value = snail_n;
pointer = hrm_box_grid;
}
cout << "请输入蜗牛行进的最多步数";
cin >> step_vax;
//incertchain(ssnail_m, ssnail_n, pointer);//insertchain();
calculate(mesh, snail_m, snail_n, step_vax);
}
/
void initialize(int mmesh_mirror[m][n])
{
for (int ii = 0; ii < m; ii++)
{
mmesh_mirror[ii][n-1] = 4;
mmesh_mirror[ii][0] = 4;
}
for (int ij = 0; ij < n; ij++)
{
mmesh_mirror[0][ij] = 4;
mmesh_mirror[m-1][ij] = 4;
}
char YorN_stone;
cout << "是否持续输入中间的石头(Y or N)?";
cin >> YorN_stone;
while( YorN_stone == 'Y' || YorN_stone == 'y' )
{
int stone_row, stone_vertical;
cout << " 请输入本石头处于第几行?" ;
cin >> stone_row;
cout << " 请输入本石头处于第几列?" ;
cin >> stone_vertical;
if( stone_row<m && stone_vertical<n )
mmesh_mirror[stone_row-1][stone_vertical-1] = 4;
else
cout << "此次输入的石头超出边界范围!" << endl;
cout << "是否持续输入中间的石头(Y or N)?";
cin >> YorN_stone;
}
char YorN_feces_box;
cout << "是否持续输入中间的垃圾和可推动箱子(Y or N)?";
cin >> YorN_feces_box;
if( YorN_feces_box == 'Y' || YorN_feces_box == 'y' )
{
cout << "请输入垃圾和可推动箱子的数目(二者相同):";
cin >> Number_feces_box;
for (int ik_f = 1; ik_f <= Number_feces_box; ik_f++ )
{
int feces_row, feces_vertical;
cout << " 请输入第" << ik_f << "堆垃圾所处的行和列(空格隔开):" ;
cin >> feces_row >> feces_vertical;
feces_row--; feces_vertical--;
if( feces_row>0 && feces_vertical>0 && feces_row<m && feces_vertical<n) mmesh_mirror[feces_row][feces_vertical] = 1;
else { cout << "第" << ik_f << "堆垃圾输入错误!"; ik_f--; }
}
for (int ik_b = 1; ik_b <= Number_feces_box; ik_b++ )
{
int box_row, box_vertical;
cout << " 请输入第" << ik_b << "个箱子所处的行和列(空格隔开):" ;
cin >> box_row >> box_vertical;
box_row--; box_vertical--;
if( box_row>0 && box_vertical>0 && box_row<m && box_vertical<n)
{
if( mmesh_mirror[box_row][box_vertical] == 1 )
{mmesh_mirror[box_row][box_vertical] = 3; V++;}
else
mmesh_mirror[box_row][box_vertical] = 2;
}
else { cout << "第" << ik_b << "堆垃圾输入错误!"; ik_b--; }
}
}
}
/
//hrm_box_grid used to make a start of the path chain belt
void calculate( int mmesh[m][n], int &ssnail_m,
int &ssnail_n, int &sstep_vax)
{
for(int i=0; i<=sstep_vax; i++)
{
if(i==sstep_vax) deletechain(i,pointer,ssnail_m,ssnail_n,mmesh);
switch(direct)
{
case 1:/
switch(mmesh[ssnail_m][ssnail_n-1])
{
case 0: ssnail_n--; insertchain(ssnail_m, ssnail_n, pointer); pointer->pushbox =0; break;//insertchain();
case 1: ssnail_n--; insertchain(ssnail_m, ssnail_n, pointer); pointer->pushbox =0; break;//insertchain();
case 2:// //
if(mmesh[ssnail_m][ssnail_n-2]==1)
{
mmesh[ssnail_m][ssnail_n-1]=0;
mmesh[ssnail_m][ssnail_n-2]=3;
ssnail_n--;
insertchain(ssnail_m, ssnail_n, pointer); pointer->pushbox =1;//insertchain();
++V;
if(V == Number_feces_box) {cout<< " 成功了" <<endl;freespace();exit(0);}
break;
}
else
{
if( mmesh[ssnail_m][ssnail_n-2]==2
|| mmesh[ssnail_m][ssnail_n-2]==3
|| mmesh[ssnail_m][ssnail_n-2]==4 )
{
direct++;
i--;
break;
}
else
{
if(mmesh[ssnail_m][ssnail_n-2]==0)
{
mmesh[ssnail_m][ssnail_n-1]=0;
mmesh[ssnail_m][ssnail_n-2]=2;
ssnail_n--;
insertchain(ssnail_m, ssnail_n, pointer); pointer->pushbox =1;//insertchain();
break;
}
else cout << "The value of grid is wrong1!" << endl;
}
}
case 3:// //
if(mmesh[ssnail_m][ssnail_n-2]==1)
{
mmesh[ssnail_m][ssnail_n-1]=1;
mmesh[ssnail_m][ssnail_n-2]=3;
ssnail_n--;
insertchain(ssnail_m, ssnail_n, pointer); pointer->pushbox =1;//insertchain();
break;
}
else
{
if( mmesh[ssnail_m][ssnail_n-2]==2
|| mmesh[ssnail_m][ssnail_n-2]==3
|| mmesh[ssnail_m][ssnail_n-2]==4 )
{
direct++;
i--;
break;
}
else
{
if(mmesh[ssnail_m][ssnail_n-2]==0)
{
mmesh[ssnail_m][ssnail_n-1]=1;
mmesh[ssnail_m][ssnail_n-2]=2;
ssnail_n--;
insertchain(ssnail_m, ssnail_n, pointer); pointer->pushbox =1;//insertchain();
V--;
break;
}
else cout << "The value of grid is wrong2!" << endl;
}
}
case 4: direct++; i--; break;
default: cout << "The value of grid is wrong3!" << endl; break;
}
break;
case 2:/
/
switch(mmesh[ssnail_m-1][ssnail_n])
{
case 0: ssnail_m--; insertchain(ssnail_m, ssnail_n, pointer); pointer->pushbox =0; direct =1; break;//insertchain();
case 1: ssnail_m--; insertchain(ssnail_m, ssnail_n, pointer); pointer->pushbox =0; direct =1; break;//insertchain();
case 2:// //
if(mmesh[ssnail_m-2][ssnail_n]==1)
{
mmesh[ssnail_m-1][ssnail_n]=0;
mmesh[ssnail_m-2][ssnail_n]=3;
ssnail_m--;
insertchain(ssnail_m, ssnail_n, pointer); pointer->pushbox =1; direct =1; //insertchain();
V++;
if(V == Number_feces_box) {cout<< " 成功了" <<endl;freespace();exit(0);}
break;
}
else
{
if( mmesh[ssnail_m-2][ssnail_n]==2
|| mmesh[ssnail_m-2][ssnail_n]==3
|| mmesh[ssnail_m-2][ssnail_n]==4 )
{
direct++;
i--;
break;
}
else
{
if(mmesh[ssnail_m-2][ssnail_n]==0)
{
mmesh[ssnail_m-1][ssnail_n]=0;
mmesh[ssnail_m-2][ssnail_n]=2;
ssnail_m--;
insertchain(ssnail_m, ssnail_n, pointer); pointer->pushbox =1; direct =1; //insertchain();
break;
}
else cout << "The value of grid is wrong4!" << endl;
}
}
case 3:// //
if(mmesh[ssnail_m-2][ssnail_n]==1)
{
mmesh[ssnail_m-1][ssnail_n]=1;
mmesh[ssnail_m-2][ssnail_n]=3;
ssnail_m--;
insertchain(ssnail_m, ssnail_n, pointer); pointer->pushbox =1; direct =1; //insertchain();
break;
}
else
{
if( mmesh[ssnail_m-2][ssnail_n]==2
|| mmesh[ssnail_m-2][ssnail_n]==3
|| mmesh[ssnail_m-2][ssnail_n]==4 )
{
direct++;
i--;
break;
}
else
{
if(mmesh[ssnail_m-2][ssnail_n]==0)
{
mmesh[ssnail_m-1][ssnail_n]=1;
mmesh[ssnail_m-2][ssnail_n]=2;
ssnail_m--;
insertchain(ssnail_m, ssnail_n, pointer); pointer->pushbox =1; direct =1; //insertchain();
V--;
break;
}
else cout << "The value of grid is wrong5!" << endl;
}
}
case 4: direct++; i--; cout<< " 设置断点的语句无用" << endl; break;
default: cout << "The value of grid is wrong6!" << endl; break;
}
break;
case 3:/
/
/
switch(mmesh[ssnail_m][ssnail_n+1])
{
case 0: ssnail_n++; insertchain(ssnail_m, ssnail_n, pointer); pointer->pushbox =0; direct =1; break;//insertchain();
case 1: ssnail_n++; insertchain(ssnail_m, ssnail_n, pointer); pointer->pushbox =0; direct =1; break;//insertchain();
case 2:// //
if(mmesh[ssnail_m][ssnail_n+2]==1)
{
mmesh[ssnail_m][ssnail_n+1]=0;
mmesh[ssnail_m][ssnail_n+2]=3;
ssnail_n++;
insertchain(ssnail_m, ssnail_n, pointer); pointer->pushbox =1; direct =1; //insertchain();
V++;
if(V == Number_feces_box){cout<< " 成功了" <<endl;freespace();exit(0);}
break;
}
else
{
if( mmesh[ssnail_m][ssnail_n+2]==2
|| mmesh[ssnail_m][ssnail_n+2]==3
|| mmesh[ssnail_m][ssnail_n+2]==4 )
{
direct++;
i--;
break;
}
else
{
if(mmesh[ssnail_m][ssnail_n+2]==0)
{
mmesh[ssnail_m][ssnail_n+1]=0;
mmesh[ssnail_m][ssnail_n+2]=2;
ssnail_n++;
insertchain(ssnail_m, ssnail_n, pointer); pointer->pushbox =1; direct =1; //insertchain();
break;
}
else cout << "The value of grid is wrong7!" << endl;
}
}
case 3:// //
if(mmesh[ssnail_m][ssnail_n+2]==1)
{
mmesh[ssnail_m][ssnail_n+1]=1;
mmesh[ssnail_m][ssnail_n+2]=3;
ssnail_n++;
insertchain(ssnail_m, ssnail_n, pointer); pointer->pushbox =1; direct =1; //insertchain();
break;
}
else
{
if( mmesh[ssnail_m][ssnail_n+2]==2
|| mmesh[ssnail_m][ssnail_n+2]==3
|| mmesh[ssnail_m][ssnail_n+2]==4 )
{
direct++;
i--;
break;
}
else
{
if(mmesh[ssnail_m][ssnail_n+2]==0)
{
mmesh[ssnail_m][ssnail_n+1]=1;
mmesh[ssnail_m][ssnail_n+2]=2;
ssnail_n++;
insertchain(ssnail_m, ssnail_n, pointer); pointer->pushbox =1; direct =1; //insertchain();
V--;
break;
}
else cout << "The value of grid is wrong8!" << endl;
}
}
case 4: direct++; i--; break;
default: cout << "The value of grid is wrong9!" << endl; break;
}
break;
case 4:/
/
/
/
switch(mmesh[ssnail_m+1][ssnail_n])
{
case 0: ssnail_m++; insertchain(ssnail_m, ssnail_n, pointer); pointer->pushbox =0; direct =1; break;//insertchain();
case 1: ssnail_m++; insertchain(ssnail_m, ssnail_n, pointer); pointer->pushbox =0; direct =1; break;//insertchain();
case 2:// //
if(mmesh[ssnail_m+2][ssnail_n]==1)
{
mmesh[ssnail_m+1][ssnail_n]=0;
mmesh[ssnail_m+2][ssnail_n]=3;
ssnail_m++;
insertchain(ssnail_m, ssnail_n, pointer); pointer->pushbox =1; direct =1; //insertchain();
V++;
if(V == Number_feces_box){cout<< " 成功了" <<endl;freespace();exit(0);}
break;
}
else
{
if( mmesh[ssnail_m+2][ssnail_n]==2
|| mmesh[ssnail_m+2][ssnail_n]==3
|| mmesh[ssnail_m+2][ssnail_n]==4 )
{
deletechain(i,pointer,ssnail_m,ssnail_n,mmesh);
i--;
break;
}
else
{
if(mmesh[ssnail_m+2][ssnail_n]==0)
{
mmesh[ssnail_m+1][ssnail_n]=0;
mmesh[ssnail_m+2][ssnail_n]=2;
ssnail_m++;
insertchain(ssnail_m, ssnail_n, pointer); pointer->pushbox =1; direct =1; //insertchain();
break;
}
else cout << "The value of grid is wrong10!" << endl;
}
}
case 3:// //
if(mmesh[ssnail_m+2][ssnail_n]==1)
{
mmesh[ssnail_m+1][ssnail_n]=1;
mmesh[ssnail_m+2][ssnail_n]=3;
ssnail_m++;
insertchain(ssnail_m, ssnail_n, pointer); pointer->pushbox =1; direct =1; //insertchain();
break;
}
else
{
if( mmesh[ssnail_m+2][ssnail_n]==2
|| mmesh[ssnail_m+2][ssnail_n]==3
|| mmesh[ssnail_m+2][ssnail_n]==4 )
{
deletechain(i,pointer,ssnail_m,ssnail_n,mmesh);
i--;
break;
}
else
{
if(mmesh[ssnail_m+2][ssnail_n]==0)
{
mmesh[ssnail_m+1][ssnail_n]=1;
mmesh[ssnail_m+2][ssnail_n]=2;
ssnail_m++;
insertchain(ssnail_m, ssnail_n, pointer); pointer->pushbox =1; direct =1; //insertchain();
V--;
break;
}
else cout << "The value of grid is wrong11!" << endl;
}
}
case 4: deletechain(i,pointer,ssnail_m,ssnail_n,mmesh); i--; break;//direct++;
default: cout << "The value of grid is wrong12!THE LAST 4WRONG!" << endl; break;
}
break;
default: cout << "完cheng了!" << endl;break;
}
}
}
void insertchain(int &ssnail_m, int &ssnail_n, box_grid *(&ppointer))
{
(*ppointer).next = new box_grid;//insertchain(ssnail_m, ssnail_n, pointer);
ppointer -> next ->box_grid_l_value = ssnail_m;
(*(*ppointer).next).box_grid_v_value = ssnail_n;
ppointer -> next -> next = NULL;
ppointer -> next -> previous = ppointer;
ppointer = ppointer ->next;
ppointer -> pushbox = 0;//just initialize
}
void deletechain(int &ii, box_grid* &ppointer, int &ssnail_m, int &ssnail_n, int mmesh[m][n])
{
if(ii==0) {cout << "这样就完事了,废物?" <<endl; freespace(); exit(0);}
else{}
switch(ppointer->box_grid_v_value - ((*ppointer).previous)->box_grid_v_value)
{
case -1:
direct = 2;
switch(ppointer->pushbox)
{
case 0: break;
case 1:
switch(mmesh[ppointer->box_grid_l_value][ppointer->box_grid_v_value-1] + mmesh[ppointer->box_grid_l_value][ppointer->box_grid_v_value])
//through the sum of currently mmesh value and previous mmesh value ,judge whether V--
{
case 4: break;
case 3:
if(mmesh[ppointer->box_grid_l_value][ppointer->box_grid_v_value] == 1) V++;
else V--;
break;
case 2: break;
default: cout << "wrong!" <<endl; break;
}
//take back the value of mmesh
--(--mmesh[ppointer->box_grid_l_value][ppointer->box_grid_v_value-1]);
++(++mmesh[ppointer->box_grid_l_value][ppointer->box_grid_v_value]);
break;
//default: break;//{cout<<"there is wrong to define whether box pushed!";exit(0);}
}/
del(ppointer, ssnail_m, ssnail_n); --ii; break;
case 1:
direct = 4;
switch(ppointer->pushbox)
{
case 0: break;
case 1:
switch(mmesh[ppointer->box_grid_l_value][ppointer->box_grid_v_value+1] + mmesh[ppointer->box_grid_l_value][ppointer->box_grid_v_value])
//through the sum of currently mmesh value and previous mmesh value ,judge whether V--
{
case 4: break;
case 3:
if(mmesh[ppointer->box_grid_l_value][ppointer->box_grid_v_value] == 1) V++;
else V--;
break;
case 2: break;
default: cout << "wrong!" <<endl; break;
}
//take back the value of mmesh
--(--mmesh[ppointer->box_grid_l_value][ppointer->box_grid_v_value+1]);
++(++mmesh[ppointer->box_grid_l_value][ppointer->box_grid_v_value]);
break;
//default: {cout<<"there is wrong to define whether box pushed!";exit(0);}
}
del(ppointer, ssnail_m, ssnail_n); --ii; break;
default:
switch(ppointer->box_grid_l_value - (ppointer->previous)->box_grid_l_value)
{
case -1:
direct = 3;
switch(ppointer->pushbox)
{
case 0: break;
case 1:
switch(mmesh[ppointer->box_grid_l_value-1][ppointer->box_grid_v_value] + mmesh[ppointer->box_grid_l_value][ppointer->box_grid_v_value])
//through the sum of currently mmesh value and previous mmesh value ,judge whether V--
{
case 4: break;
case 3:
if(mmesh[ppointer->box_grid_l_value][ppointer->box_grid_v_value] == 1) V++;
else V--;
break;
case 2: break;
default: cout << "wrong!" <<endl; break;
}//
//take back the value of mmesh
--(--mmesh[ppointer->box_grid_l_value-1][ppointer->box_grid_v_value]);
++(++mmesh[ppointer->box_grid_l_value][ppointer->box_grid_v_value]);
break;
//default: {cout<<"there is wrong to define whether box pushed!";exit(0);}
}
del(ppointer, ssnail_m, ssnail_n); --ii; break;
case 1:
direct = 5;
cout << "there is 4,direct is 4,so delete back!" <<endl;
switch(ppointer->pushbox)
{
case 0: break;
case 1:
switch(mmesh[ppointer->box_grid_l_value+1][ppointer->box_grid_v_value] + mmesh[ppointer->box_grid_l_value][ppointer->box_grid_v_value])
//through the sum of currently mmesh value and previous mmesh value ,judge whether V--
{
case 4: break;
case 3:
if(mmesh[ppointer->box_grid_l_value][ppointer->box_grid_v_value] == 1) V++;
else V--;
break;
case 2: break;
default: cout << "wrong!" <<endl; break;
}
//take back the value of mmesh
--(--mmesh[ppointer->box_grid_l_value+1][ppointer->box_grid_v_value]);
++(++mmesh[ppointer->box_grid_l_value][ppointer->box_grid_v_value]);
break;
//default: {cout<<"there is wrong to define whether box pushed!";exit(0);}
}
del(ppointer, ssnail_m, ssnail_n); --ii;
deletechain(ii,ppointer,ssnail_m,ssnail_n,mmesh); break;
default: break;
}
break;
}
}
void del(box_grid* &ppointer, int &ssnail_m, int &ssnail_n)
{
box_grid *xxoo = ppointer;
ppointer->previous->next = NULL;
ppointer = ppointer->previous;
ppointer->next = NULL;
delete xxoo;
ssnail_m = ppointer->box_grid_l_value;
ssnail_n = ppointer->box_grid_v_value;
}
void freespace()
{
//delete []mesh;
while(hrm_box_grid->next!=NULL)
{
box_grid *xxoo = hrm_box_grid;
cout << (hrm_box_grid->box_grid_l_value + 1) << " " << (hrm_box_grid->box_grid_v_value + 1) << " ==>> " ;
hrm_box_grid = hrm_box_grid->next;
delete xxoo;
}
cout << (hrm_box_grid->box_grid_l_value + 1)<< " " << (hrm_box_grid->box_grid_v_value + 1);
delete hrm_box_grid;
}
/*//
#include<iostream>
using namespace std;
template<class T>
void sort(T a,int n){ //为甚么这里的引用&能接受数组传来的参数呢,不是
for(int i=0;i<n;i++){ // 只有数组名或指针才能接受数组名传来的
int p=i; // 的参数吗? 求大侠解释
for(int j=i;j<n;j++)
if(a[p]<a[j]) p=j;
int t=a[i];a[i]=a[p];a[p]=t;
}
}
template<class T>void display(T a,int n)
{
for(int i=0;i<n;i++)
cout<<a[i]<<"/t";
cout<<endl;
}
void main(){
int a[]={1,3,2};
char b[]={'a','A','Z','z'};
sort(a,3);
sort(b,4);
display(a,3);
display(b,4);
}
*///