zoj 1008 Gnome Tetravex

來源:互聯網
上載者:User

標籤:des   style   blog   http   color   os   io   strong   

Gnome TetravexTime Limit: 10 Seconds      Memory Limit: 32768 KB

Hart is engaged in playing an interesting game, Gnome Tetravex, these days. In the game, at the beginning, the player is given n*n squares. Each square is divided into four triangles marked four numbers (range from 0 to 9). In a square, the triangles are the left triangle, the top triangle, the right triangle and the bottom triangle. For example, Fig. 1 shows the initial state of 2*2 squares.


Fig. 1 The initial state with 2*2 squares

The player is required to move the squares to the termination state. In the termination state, any two adjoining squares should make the adjacent triangle marked with the same number. Fig. 2 shows one of the termination states of the above example.


Fig. 2 One termination state of the above example

It seems the game is not so hard. But indeed, Hart is not accomplished in the game. He can finish the easiest game successfully. When facing with a more complex game, he can find no way out.

One day, when Hart was playing a very complex game, he cried out, "The computer is making a goose of me. It‘s impossible to solve it." To such a poor player, the best way to help him is to tell him whether the game could be solved. If he is told the game is unsolvable, he needn‘t waste so much time on it.


Input

The input file consists of several game cases. The first line of each game case contains one integer n, 0 <= n <= 5, indicating the size of the game.

The following n*n lines describe the marking number of these triangles. Each line consists of four integers, which in order represent the top triangle, the right triangle, the bottom triangle and the left triangle of one square.

After the last game case, the integer 0 indicates the termination of the input data set.


Output

You should make the decision whether the game case could be solved. For each game case, print the game number, a colon, and a white space, then display your judgment. If the game is solvable, print the string "Possible". Otherwise, please print "Impossible" to indicate that there‘s no way to solve the problem.

Print a blank line between each game case.

Note: Any unwanted blank lines or white spaces are unacceptable.


Sample Input

2
5 9 1 4
4 4 5 6
6 8 5 4
0 4 4 3
2
1 1 1 1
2 2 2 2
3 3 3 3
4 4 4 4
0


Output for the Sample Input

Game 1: Possible

Game 2: Impossible

 

 

        這道題做了很久,還是沒有做出來,陷入了死胡同吧,網上好多人都覺得很簡單,這就是差距吧。在網上看到的方法:把不同的方塊存在不同的數組中,相同的就存在同一個數組中,並記錄個數。然後遍曆各個點。還有就是注意格式問題,每兩個之間有一個空行,最後那個範例沒有空行。

 

#include <stdio.h>#include <string.h>int map[30][4];int counting[30], mark[30];int DFS(int num, int n, int cur){    if(num == n*n)        return 1;    for(int i = 0; i<cur; i++)    {        if(!counting[i])   //如果用完就跳過            continue;        if(num%n != 0)   //把不是第一列的來判斷        {            if(map[i][3] != map[ mark[num-1] ][1])                continue;        }        if(num/n != 0)   //把不是第一行的來判斷        {            if(map[i][0] != map[ mark[num-n] ][2])                continue;        }        mark[num] = i;        counting[i]--;        if(DFS(num+1, n, cur))            return 1;        else            counting[i]++;    }    return 0;}int main(){    int T = 1;    int n, up, down, left, right, cur;    while(scanf("%d", &n)!=EOF && n)    {        cur = 0;     //初始化        memset(map, 0, sizeof(map));        memset(mark, 0, sizeof(mark));        memset(counting, 0, sizeof(counting));        for(int i = 0, j; i<n*n; i++)        {            scanf("%d%d%d%d", &up, &right, &down, &left);            for(j = 0; j<cur; j++)            {                if(up==map[j][0] && right==map[j][1] && down==map[j][2] && left==map[j][3])  //把相同的存入同一個數組,記錄個數                {                    counting[j]++;                    break;                }            }            if(j == cur)   //把不同的存入數組            {                map[j][0] = up;    map[j][1] = right;                map[j][2] = down;  map[j][3] = left;                counting[j]++;                cur++;            }        }        if(T > 1)   //用來處理格式問題            printf("\n");        if(DFS(0, n, cur))            printf("Game %d: Possible\n", T++);        else            printf("Game %d: Impossible\n", T++);    }    return 0;}

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.