首页 > 解决方案 > C# 中的房间管理程序

问题描述

以下程序旨在重现基本的酒店房间预订方案。创建酒店号实例后,通过调用该checkIn()方法,程序会检查是否有可用房间,如果有则保留房间。

checkOut()但是,如果在分配完所有房间后,有人从一个房间(通过方法)退房,例如房间号 1,然后尝试入住该房间,则它不起作用。checkIn()调用方法时会出现此问题hasRoomsAvailable(),在这种情况下返回 false 而不是 true,因为事实currentRoomNumber是 5。

在不改变每种方法的时间复杂度的情况下,有人可以建议如何解决这个问题,理想情况下如何改进设计?

using System;

namespace HotelManagement
{
    //Hotel class
    public class Hotel
    {
        private bool[] available;
        private int totalNumberOfRooms;
        private int currentRoomNumber;

        // constructor to set number of rooms
        private Hotel(int totalNumberOfRooms)
        {
            this.totalNumberOfRooms = totalNumberOfRooms;
            available = new bool[totalNumberOfRooms];

            for (int i = 0; i < totalNumberOfRooms; i++)   
                available[i] = true;
        }

        //Returns true if room is available
        private bool hasRoomsAvailable()
        {
            if (currentRoomNumber < totalNumberOfRooms &&
                available[currentRoomNumber])
                return available[currentRoomNumber];
            else
                return false;
        }

        //Time Complexity: O(1)

        //Checks if there's at least one room available and it reserves it
        private int checkIn()
        {
            if (hasRoomsAvailable())
            {
                available[currentRoomNumber] = false;
                return ++currentRoomNumber;
            }
            else
                return -1;
        }
        //Time Complexity: O(1)

        //Check out method
        private void checkOut(int roomNumber)
        {
            if (roomNumber <= totalNumberOfRooms && roomNumber != -1)
            {
                if (available[roomNumber - 1] == false)
                {
                    available[roomNumber - 1] = true;
                    Console.WriteLine("Check out room : {0}", roomNumber);
                }
                else
                    Console.WriteLine("Invalid Check Out : {0}", roomNumber);
            }
            else
                Console.WriteLine("Incorrect room number : {0}", roomNumber);
        }
        //Time Complexity: O(1)

        public static void Main(string[] args)
        {
            //Create an instance of Hotel with 5 rooms
            Hotel hotel = new Hotel(5);
            int roomNum = -1;

            if (hotel.hasRoomsAvailable())
            {
                roomNum = hotel.checkIn();
                Console.WriteLine("Room Allocated is: {0}", roomNum);

                roomNum = hotel.checkIn();
                Console.WriteLine("Room Allocated is: {0}", roomNum);

                roomNum = hotel.checkIn();
                Console.WriteLine("Room Allocated is: {0}", roomNum);

                roomNum = hotel.checkIn();
                Console.WriteLine("Room Allocated is: {0}", roomNum);

                roomNum = hotel.checkIn();
                Console.WriteLine("Room Allocated is: {0}", roomNum);
            }

            hotel.checkOut(1);
            roomNum = hotel.checkIn();

            Console.WriteLine("Room Allocated is: {0}", roomNum);

            //pause program output on console
            Console.ReadLine();
        }
    }
}

标签: c#oop

解决方案


bool[] available找个可以入住的房间就够了。维护currentRoomNumber带来的困难多于其价值。

public class Hotel
{
    private bool[] available;
    private int totalNumberOfRooms;        

    // constructor to set number of rooms
    public Hotel(int totalNumberOfRooms)
    {
        this.totalNumberOfRooms = totalNumberOfRooms;
        available = new bool[totalNumberOfRooms];

        for (int i = 0; i < totalNumberOfRooms; i++)   
            available[i] = true;
    }

    //Returns true if room is available
    public bool hasRoomsAvailable()
    {
        return available.Any(room => room);
    }

    //Time Complexity: O(1)

    //Checks if there's at least one room available and it reserves it
    public int checkIn()
    {
        for(int room = 0; room < totalNumberOfRooms; room++)
        {
            if (available[room])
            {
                available[room] = false;
                return room + 1;
            }
        }

        return -1;
    }
    //Time Complexity: O(1)

    //Check out method
    public void checkOut(int roomNumber)
    {
        if (roomNumber <= totalNumberOfRooms && roomNumber > 0)
        {
            if (available[roomNumber - 1] == false)
            {
                available[roomNumber - 1] = true;
                Console.WriteLine("Check out room : {0}", roomNumber);
            }
            else
                Console.WriteLine("Invalid Check Out : {0}", roomNumber);
        }
        else
            Console.WriteLine("Incorrect room number : {0}", roomNumber);
    }
}
public static void Main(string[] args)
{
    //Create an instance of Hotel with 5 rooms
    Hotel hotel = new Hotel(5);
    int roomNum = -1;

    if (hotel.hasRoomsAvailable())
    {
        roomNum = hotel.checkIn();
        Console.WriteLine("Room Allocated is: {0}", roomNum);

        roomNum = hotel.checkIn();
        Console.WriteLine("Room Allocated is: {0}", roomNum);

        roomNum = hotel.checkIn();
        Console.WriteLine("Room Allocated is: {0}", roomNum);

        roomNum = hotel.checkIn();
        Console.WriteLine("Room Allocated is: {0}", roomNum);

        roomNum = hotel.checkIn();
        Console.WriteLine("Room Allocated is: {0}", roomNum);
    }

    hotel.checkOut(1);
    roomNum = hotel.checkIn();

    Console.WriteLine("Room Allocated is: {0}", roomNum);

    Console.ReadLine();
}


使用 Queue 存储可用房间的 O(1) 复杂度的解决方案:

public class Hotel
{
    private Queue<int> rooms;
    private int totalNumberOfRooms;        

    // constructor to set number of rooms
    public Hotel(int totalNumberOfRooms)
    {
        this.totalNumberOfRooms = totalNumberOfRooms;
        rooms = new Queue<int>();

        for (int i = 1; i <= totalNumberOfRooms; i++)   
            rooms.Enqueue(i);
    }

    //Returns true if room is available
    public bool hasRoomsAvailable()
    {
        return rooms.Count > 0;
    }

    //Time Complexity: O(1)

    //Checks if there's at least one room available and it reserves it
    public int checkIn()
    {
        if (rooms.Count > 0)
            return rooms.Dequeue();

        return -1;
    }
    //Time Complexity: O(1)

    //Check out method
    public void checkOut(int roomNumber)
    {
        if (roomNumber <= totalNumberOfRooms && roomNumber > 0)
        {
            Console.WriteLine("Check out room : {0}", roomNumber);
            rooms.Enqueue(roomNumber);
        }
        else
            Console.WriteLine("Incorrect room number : {0}", roomNumber);
    }
}

public static void Main(string[] args)
{
    //Create an instance of Hotel with 5 rooms
    Hotel hotel = new Hotel(5);
    int roomNum = -1;

    if (hotel.hasRoomsAvailable())
    {
        roomNum = hotel.checkIn();
        Console.WriteLine("Room Allocated is: {0}", roomNum);

        roomNum = hotel.checkIn();
        Console.WriteLine("Room Allocated is: {0}", roomNum);

        roomNum = hotel.checkIn();
        Console.WriteLine("Room Allocated is: {0}", roomNum);

        roomNum = hotel.checkIn();
        Console.WriteLine("Room Allocated is: {0}", roomNum);

        roomNum = hotel.checkIn();
        Console.WriteLine("Room Allocated is: {0}", roomNum);
    }

    hotel.checkOut(4);
    hotel.checkOut(2);
    roomNum = hotel.checkIn();
    Console.WriteLine("Room Allocated is: {0}", roomNum);

    roomNum = hotel.checkIn();

    Console.WriteLine("Room Allocated is: {0}", roomNum);

    //pause program output on console
    Console.ReadLine();
}

推荐阅读