SDUT 1125 New Game 【 DFS 】

Description

New game是在一個M*M的特殊棋盤(棋盤的第i行都標上了數字i)上進行的新式遊戲。給定一個數字N,要求選手把一個棋子從左上角(1,1)移到右下角(M,M),移動時只能往右或往下。要求移動後經過的數字和爲N,且拐彎的次數最少。

如果對給出的N,選手不能找出移動方案使得經過的數字和爲N或找出的路徑拐彎次數不是最少,選手就輸了。所以,選手一定千方百計要找出滿足條件的路徑!!

Input

兩個正整數M,N(其中M<=16),數據保證有解。

Output

最少拐彎數。

Sample

Input 

4 22

Output 

1

題解:DFS 搜索,注意判斷拐彎的次數,第一次無論是向右還是向下都是不算的,只有路徑發生變化,纔算是,所以可以設置一個 flag 值,因爲只有向下和向右兩種情況,只要是0 和 1 就可以,與上次不相同, num ++ 。最後還是看了一下題解才知道自己錯哪裏了。

(愈來愈菜,嚶)

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <bits/stdc++.h>
using namespace std;
const int N = 500;
const int inf = 0x3f3f3f3f;
int n,m,ans;
int gra[N][N];
int vis[N][N];
int dx[4] = {1,0};
int dy[4] = {0,1};
// sum 是到目前爲止的和
// num 是轉彎的次數
void dfs(int x, int y,int flag, int sum, int num)
{
    if(sum > n) return ;
    if(num > ans) return ;
    if(x == m && y == m){
        if(sum == n){
            ans = min(ans,num);
        }
        return ;
    }

    for(int i = 0; i <= 1; i ++) {

        int tx = x + dx[i];
        int ty = y + dy[i];
        if(tx >= 1 && tx <= m && ty >= 1 && ty <= m && !vis[tx][ty]){
            vis[tx][ty] = 1;
           if(sum==1)
			dfs(tx,ty,i,sum+gra[tx][ty],num);
			else
			{
				if(i!=flag)
					dfs(tx,ty,i,sum+gra[tx][ty],num+1);
				else
					dfs(tx,ty,i,sum+gra[tx][ty],num);
			}
			vis[tx][ty]=0;
        }

    }
}

int main()
{
    scanf("%d %d", &m, &n);
    memset(vis,0,sizeof(vis));
    for(int i = 1; i <= m; i ++){
        for(int j = 1;j <= m; j ++){
            gra[i][j] = i;
        }
    }
    ans = inf;
    vis[1][1] = 1;
    dfs(1,1,0,1,0);
    printf("%d\n",ans);
    return 0;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章