数字华容道

· · 个人记录

//转自:https://www.luogu.com.cn/blog/Los/creative-code-1
#include <bits/stdc++.h>
#include <windows.h>
#include <conio.h>
using namespace std;
int num[10005]={0};
int n,p[105][105],x,y,sum;
bool iswin(){
    int f=1;
    for(int i=1;i<=n-1;i++){
        for(int j=1;j<=n;j++){
            if(p[i][j]!=f)return false;
            f++;
        }
    }
    for(int j=1;j<=n-1;j++){
        if(p[n][j]!=f)return false;
        f++;
    }
    return true;
}
int main(){
    srand(time(NULL));
    cout<<"Welcome to play n-puzzle!Make sure that you're using Windows System..."<<endl;
    cout<<"Please input the length:";
    cin>>n;
    x=rand()%n+1;
    y=rand()%n+1;
    for(int i=1;i<=n;i++){
        for(int j=1;j<=n;j++){
            if(i==x && j==y)continue;
            int k=rand()%(n*n-1)+1;
            while(num[k])k=rand()%(n*n-1)+1;
            p[i][j]=k;
            num[k]=1;
        }
    }
    for(int i=1;i<=n*n;i++)num[i]=0;
    while(!iswin()){
        char a;
        system("cls");
        cout<<"---------------------------------"<<endl;
        cout<<"  You have been moved "<<sum<<" steps."<<endl;
        cout<<"  Move: W A S D     Restart: R "<<endl;
        cout<<"---------------------------------"<<endl;
        for(int i=1;i<=n;i++){
            for(int j=1;j<=n;j++){
                if(i==x && j==y)printf("%-5c",'*');
                else printf("%-5d",p[i][j]);
            }
            cout<<endl;
        }
        a=getch();
        if(a=='w' || a=='W'){
            if(x!=n){
                p[x][y]=p[x+1][y];
                x++;    
            }
        }
        if(a=='s' || a=='S'){
            if(x!=1){
                p[x][y]=p[x-1][y];
                x--;    
            }
        }
        if(a=='a' || a=='A'){
            if(y!=n){
                p[x][y]=p[x][y+1];
                y++;    
            }
        }
        if(a=='d' || a=='D'){
            if(y!=1){
                p[x][y]=p[x][y-1];
                y--;    
            }
        }
        if(a=='r' || a=='R'){
            x=rand()%n+1;
            y=rand()%n+1;
            for(int i=1;i<=n;i++){
                for(int j=1;j<=n;j++){
                    if(i==x && j==y)continue;
                    int k=rand()%(n*n-1)+1;
                    while(num[k])k=rand()%(n*n-1)+1;
                    p[i][j]=k;
                    num[k]=1;
                }
            }
            for(int i=1;i<=n*n;i++)num[i]=0;
            sum=0;
        }
        sum++;
    }
    system("cls");
    cout<<"*-----------------*"<<endl;
   printf("|    Total:%-5d  |\n",sum);
    cout<<"|     You Win!    |"<<endl;
    cout<<"*-----------------*"<<endl;
    return 0;
}