制作一个华容道(n*n)
参考程序:
#include<bits/stdc++.h>
using namespace std;
int main()
{
srand(time(0));
int num,arr[11][11],k=1,x,y,xSpace,ySpace,cmp,ans=0;
bool flag,flag2[150]={false};
flag2[0]=true;
cin>>num;
for(int i=1;i<=num;i++)
for(int j=1;j<=num;j++)
{
if(i!=num||j!=num)
{
do
{
cmp=rand()%(num*num);
}while(flag2[cmp]);
flag2[cmp]=true;
arr[i][j]=cmp;
}
}
arr[num][num]=NULL;
xSpace=num;
ySpace=num;
for(int i=1;i<=num;i++)
{
for(int j=1;j<=num;j++)
{
if(xSpace==i&&ySpace==j) cout<<setw(3)<<" ";
else cout<<setw(3)<<arr[i][j];
}
cout<<endl;
}
while(true)
{
do
{
cin>>x>>y;
}while(x!=xSpace&&ySpace!=y);
if(xSpace==x)
{
if(y<ySpace) for(int i=ySpace-1;i>=y;i--) arr[x][i+1]=arr[x][i];
else for(int i=ySpace+1;i<=y;i++) arr[x][i-1]=arr[x][i];
}
else
{
if(x<xSpace) for(int i=xSpace-1;i>=x;i--) arr[i+1][y]=arr[i][y];
else for(int i=xSpace+1;i<=x;i++) arr[i-1][y]=arr[i][y];
}
arr[x][y]=NULL;
xSpace=x;
ySpace=y;
k=1;
flag=true;
for(int i=1;i<=num;i++) for(int j=1;j<=num;j++) if(arr[i][j]!=k++&&j!=num&&i!=num) flag=false;
ans++;
if(flag)
{
cout<<"YOU WIN :"<<ans;
return 0;
}
for(int i=1;i<=num;i++)
{
for(int j=1;j<=num;j++)
{
if(xSpace==i&&ySpace==j) cout<<setw(3)<<" ";
else cout<<setw(3)<<arr[i][j];
}
cout<<endl;
}
}
return 0;
}